如何在Django中通过多种形式捕获复杂的数据库事务

时间:2019-07-03 14:05:26

标签: django django-models

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

我觉得这样做的明显方法是利用大量Javascript创建一个JSON对象,其中包含可以以单一形式发布的所有必要更改。我并不热衷于这种方法,因为它阻止了我使用Django的CreateViewUpdateView类以及它们附带的验证。同样,我比Python更适应Python。

我想使用一系列表单POST来建立必要的更改,但是还需要使事务是原子的,据我所知,这在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的模型形式和相关视图以及模型验证。
  • 不使用不完整的对象污染主要模型。
  • 在主要模型中强制字段不为空。

我看到的潜在缺点是:

  • 在部分模型中复制对主模型的任何更改(方法不是DRY)。
  • 这是一种比较复杂的方法(简单胜于复杂)

使用这种方法是否有我没有预见到的缺点,或者我可以使用更好的方法?

0 个答案:

没有答案