2

问题:信号接收器检查特定条件下是否存在模型条目,如果不存在,则创建一个新条目。在极少数情况下,条目被重复。

在接收器函数中:

try:
    my_instance = MyModel.objects.get(field1=value1, field2=sender)
except:
    my_instance = MyModel(field1=value1, field2=sender)
    my_instance.save()

这是一个明显的候选者get_or_create,但除了清理该代码之外,使用get_or_create有助于防止这个问题吗?

该信号是在用户操作之后发送的,但我不认为原始请求被重复,因为这会触发其他操作。

在数千个实例中重复发生了几次。这是否一定是由多个请求引起的,还是可以通过某种方式创建重复线程?有没有办法——也许是细粒度的事务管理——来防止重复?

在 Apache2 上使用 Django 1.1、Python 2.4、PostgreSQL 8.1 和 mod_wsgi。

4

2 回答 2

2

为防止信号重复,如文档中所述,将“dispatch_uid”参数添加到信号附件代码中。

确保您打开了一个事务 - 否则它可能会发生,在检查表的 (objects.get()) 和 cration (save()) 状态之间发生变化。

于 2011-03-11T23:50:14.467 回答
1

也许这个答案可能会有所帮助。显然,交易是正确使用的,get_or_create但我没有确认这一点。mod_wsgi 是多进程和多线程的(都是可配置的),这意味着竞争条件肯定会发生。我猜在您的应用程序中发生的事情是启动了两个单独的请求,它们将为 生成相同的值field1,并且恰好它们在正确的时间执行以添加“重复”条目。

如果 的组合MyModel(field1=value1, field2=sender)必须是唯一的,则unique_together在您的模型上定义一个约束以进一步帮助完整性。

于 2011-03-11T23:23:50.390 回答