Django信号与批量删除/更新

5

我找不到任何关于为什么会发生这种情况的文档,但根据文档,批量操作不应该触发模型信号。

现在问题是,如果我执行 somequeryset.delete(),即使它是批量操作,每个删除的对象都会触发一个信号!另一方面,somequeryset.update(someField=5) 不会触发任何信号!

所以这实际上是一个意外的结果,我希望两者的行为都相同。

Django 1.7.7

有什么想法吗?我希望删除具有信号,但不接受在批量删除时触发它。


2
somequeryset.delete() 调用 delete 方法,它不是批量删除。 - Gocht
不是这样的,因为我已经检查了所做的查询,并且它执行的是 DELETE ... WHERE id IN(匹配查询的 ID 列表) - Cristiano Coelho
之后似乎调用了“post delete”事件,但实际上并没有进行任何删除操作。 - Cristiano Coelho
1个回答

5

此处所解释的那样,它实际上并不会对每个项调用delete()方法,但它确实会调用信号。我不知道是否可能,但我也同意应该至少有一些选项在queryset.delete()中跳过信号执行。


你说得对,删除操作确实需要一些调整。如果我只想要一个批量删除选项,总是使用“第一条路径”而不是调用信号等,那该怎么办呢?现在似乎唯一的选择是原始查询。 - Cristiano Coelho
显然,这个 是一个长期存在的与此功能相关的未解决问题。你是对的,目前似乎原始查询是唯一的选择 :-( 如果没有定义 pre_deletepost_delete,快速路径的自动检测可以工作,但跳过信号还不是可选的。 - serguitus
我发现了一个解决方法,可以获得类似的行为。我只是移除了 post_delete 信号并将其代码放在自定义的 delete() 方法中。这样,当你删除一个对象(object.delete())时,原本在信号中的代码会被执行,但是当你使用 QuerySet.delete() 时,由于它不会调用 object.delete(),所以你就可以摆脱那段代码了。 - serguitus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接