Django:防止重复对象创建的策略

时间:2013-06-14 18:57:10

标签: javascript python django asynchronous

我遇到了一个创建多个数据库对象的问题,当时我只期待一个。

我的应用模型包含Form集合FieldsFormEntry集合FieldEntries。对于给定的FormEntry,我只期望每个字段有一个FieldEntry

这是我的问题:我的UI使用ajax来提交字段条目。处理提交的Django代码执行FieldEntry.objects.get_or_create()进行输入,但似乎我有某种竞争条件:如果两个ajax快速连续调用(一旦一个字段失去焦点就会触发),它似乎第二个get_or_create()可以在第一个完成之前发生,创建两个对象。我在比赛后添加了清理代码,但是如果该字段没有再次更新,则代码将不会运行。公平地说,我不确定这是导致我的多重创建问题的机制。

问题是如何最好地防止这种情况?我可以在JS中实现某种资源锁,以确保在完成同一字段的先前更新之前不会发生字段更新,但我不知道如何在JS可用之前优雅地“延迟”JS

我也可以在Django / python中实现锁定,但我认为这更复杂。

3 个答案:

答案 0 :(得分:2)

在模型字段定义集unique=True

my_field = models.ForeignKey('any_model', unique=True)

这将确保any_model没有重复条目。

答案 1 :(得分:1)

听起来您需要FieldEntry课程中的unique_together选项:

class Meta:
    unique_together = ("form", "field")

答案 2 :(得分:0)

models.py中 创建模型并添加unique=True

例如

model_name = models.CharField(max_length=120, unique= True)