django - 如何在 Django 中通过多个表单捕获复杂的数据库事务
问题描述
我需要从我的用户那里捕获一些相当复杂的数据库更改,包括为多个模型更新和创建对象。
我觉得这样做的明显方法是利用大量的 Javascript 来创建一个 JSON 对象,其中包含可以以单个表单发布的所有必要更改。我不喜欢这种方法,因为它阻止我使用 DjangoCreateView
和UpdateView
类,以及它们附带的验证。我也比 Javascript 更喜欢 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)。
- 这是一种有点复杂的方法(简单胜于复杂)
使用这种方法是否有任何我没有预见到的缺点,或者我可以使用更好的方法吗?
解决方案
推荐阅读
- javascript - DKfindout.com(网站)如何注释图像?
- vba - 动态更改 nr。VBA 数组的维数
- java - 在带空格的行上显示用户输入的 int 值
- android - com.google.cloud.translate.TranslateException:请求缺少有效的 API 密钥
- angular - 类型'可观察的
' 不可分配给类型 'Observable ' - jenkins - 在 Jenkins 中安装 JDK jdk-9.0.1-oth-JPR 时出错
- sql-server - 如何获取回历年的格鲁吉亚日期开始和结束我的查询附加
- c - 传输端点未连接
- xamarin - 单击按钮时,如何在 Xamarin.Android 应用程序中更改按钮颜色
- c++ - 更改指针后 free() 将释放多少字节?