2

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

我的应用程序模型由一个Form包含 的集合Fields和一个FormEntry包含 的集合组成FieldEntries。对于给定的FormEntry,我只希望FieldEntry每个字段一个。

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

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

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

4

3 回答 3

3

在您的模型字段定义中设置unique=True

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

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

于 2013-06-14T19:24:17.120 回答
1

听起来您需要在班级中使用unique_together选项FieldEntry

class Meta:
    unique_together = ("form", "field")
于 2013-06-14T21:21:22.370 回答
0

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

例如

model_name = models.CharField(max_length=120, unique= True)
于 2020-01-21T04:31:57.443 回答