【问题标题】:Django: strategy for preventing duplicate object creationDjango:防止重复对象创建的策略
【发布时间】:2013-06-14 18:57:09
【问题描述】:

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

我的应用程序模型由 FormFields 集合和 FormEntryFieldEntries 集合组成。对于给定的FormEntry,我只希望每个字段有一个FieldEntry

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

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

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

【问题讨论】:

    标签: javascript python django asynchronous


    【解决方案1】:

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

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

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

    【讨论】:

    • 不幸的是,我无法轻松发布所有有问题的代码,但这不起作用。 FieldEntry 模型包含每个 FieldFormEntry 的外键 - 用于结构的字段,以及用于跟踪它属于哪个条目的 formentry。我不能强制执行 unique=true,因为将有许多 FieldEntries 引用单个 FormEntry(理想情况下在 Field 上的该组中是唯一的),以及许多 FieldEntries 引用单个 Field(理想情况下在FormEntry上的那个组)
    【解决方案2】:

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

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

    【讨论】:

    • 为什么,这听起来正是我需要的!我明天试试这个。
    • +1 表示“rtfd”。当我尝试添加欺骗时引发 IntegrityError,就我而言,这是完美的!谢谢!
    【解决方案3】:

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

    例如

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

    【讨论】:

      猜你喜欢
      • 2018-09-29
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      相关资源
      最近更新 更多