Python Django form integrityerror,用于对唯一字段执行并发操作
我注意到一件事,我不知道这是否是一个真正的问题,或者我正在做一些错误的设计 我有一个模型:Python Django form integrityerror,用于对唯一字段执行并发操作,python,django,Python,Django,我注意到一件事,我不知道这是否是一个真正的问题,或者我正在做一些错误的设计 我有一个模型: class A(Model): name = CharField(unique=True, max_length=255) 一个链接到的modelform,这个modelform有一个clean_name()方法,用于检查该字段在数据库中是否唯一(忽略modelforms默认情况下已经这样做的事实,我在这里的示例中指定) 在我看来,如果我这样做 o = form.save(commit=Fals
class A(Model):
name = CharField(unique=True, max_length=255)
一个链接到的modelform,这个modelform有一个clean_name()方法,用于检查该字段在数据库中是否唯一(忽略modelforms默认情况下已经这样做的事实,我在这里的示例中指定)
在我看来,如果我这样做
o = form.save(commit=False)
# xyz
o.save()
在#xyz
中,我有另一个客户端插入了一个具有相同名称
字段值的对象,o.save()
触发Integrityerror异常,正确地防止插入重复记录
我想知道的是如何处理这些情况,我是否应该用try/except块包装o.save()
,然后填充表单上的错误字段,指定选择另一个名称
值
这在某种程度上是每个人都会遇到的常见情况,而且解决方案很糟糕,所以我认为我做错了什么 我怀疑可能是这样的:
只有在
xx_clean()
中设置了标志时,模型表单才提供唯一性验证。如果您使用自己的(正如您所拥有的)重写clean
,则需要调用超类的clean()
。请参阅。为什么不直接执行:o=form.save()?这样,下一个条目就不会通过表单验证。@在这种情况下,#xyz将介于form.is#u valid()和form.save()之间。解决方法是首先保存对象(如果在xyz
中计算了一些必填字段,则使用伪值),并且有一个名为computing
的布尔字段,当您执行xyz
时,该字段设置为True
。完成额外工作后,您可以根据xyz
的结果对其进行更新/删除,并将computing
设置为False。你的建议和我的建议都很粗糙,所以我们希望其他人能建议一种更好的方法。用手动事务和选择更新来包装视图可以吗?