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

2024-04-18 03:08:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个创建多个DB对象的问题,而我只需要一个。在

我的应用程序模型由一个Form和一个Fields集合的FormEntry组成。对于给定的FormEntry,每个字段只需要一个FieldEntry。在

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

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

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


Tags: or对象django代码模型form应用程序db
2条回答

在模型字段定义集中unique=True

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

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

听起来您需要在FieldEntry类中使用unique_together选项:

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

相关问题 更多 >