如何在Django中捕获多个表单上的复杂数据库事务

如何在Django中捕获多个表单上的复杂数据库事务,django,django-models,Django,Django Models,我需要从用户那里捕获一些相当复杂的数据库更改,包括更新和创建多个模型的对象 我觉得最明显的方法是利用大量的Javascript创建一个JSON对象,其中包含可以以单个表单发布的所有必要更改。我不喜欢这种方法,因为它阻止我使用Django的CreateView和UpdateView类,以及它们附带的验证。此外,我对Python的理解比Javascript更为自如 我想使用一系列表单帖子来构建随时间变化的必要更改,但还需要事务是原子的,据我所知,这在Django中是不可能的。另一个复杂之处是模型包含

我需要从用户那里捕获一些相当复杂的数据库更改,包括更新和创建多个模型的对象

我觉得最明显的方法是利用大量的Javascript创建一个JSON对象,其中包含可以以单个表单发布的所有必要更改。我不喜欢这种方法,因为它阻止我使用Django的
CreateView
UpdateView
类,以及它们附带的验证。此外,我对Python的理解比Javascript更为自如

我想使用一系列表单帖子来构建随时间变化的必要更改,但还需要事务是原子的,据我所知,这在Django中是不可能的。另一个复杂之处是模型包含不可为空的字段,我需要在捕获填充这些字段所需的用户输入之前创建对象。我不想让这些字段为空或使用占位符,因为这会使验证更加困难

我正在考虑的一种方法是创建每个必要模型的副本来存储部分对象。所有字段都可以为空,因此在发布所有表单之前,对象可以一次更新一点。然后,可以创建或更新原始(主)模型中的对象,以匹配新(部分)模型中的对象,然后删除这些对象

class Product(models.Model):
    field_a = models.CharField(max_length=255)
    field_b = models.PositiveIntegerField()

class PartialProduct(models.Model):
    field_a = models.CharField(max_length=255, blank=True, null=True)
    field_b = models.PositiveIntegerField(blank=True, null=True)
我认为这种方法的好处是:

  • 多表单方法,利用Django的模型表单和相关视图以及模型验证
  • 不使用不完整的对象污染主要模型
  • 强制主模型中的字段不为空
我可以看到的潜在缺点是:

  • 在部分模型中复制对主模型的任何更改(方法不是干法的)
  • 这是一种有点复杂的方法(简单比复杂好)
使用这种方法是否有我没有预见到的缺点,或者有更好的方法可以使用