2015-06-01 67 views
0

我找不到任何文件,为什么会发生这种情况,但根据文档批量操作不应触发模型信号。django信号与批量删除/更新

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

所以这是一个意想不到的结果,我希望两者的行为相同。

Django 1.7.7

任何想法?我想删除有信号,但触发大容量删除是不可接受的

+2

'somequeryset.delete()'正在调用'delete'方法,它不是批量。 – Gocht

+0

不,它不是,因为我检查了所做的查询,它做了一个DELETE ... WHERE id IN(匹配查询的ID列表) – user1777914

+0

之后,它似乎称之为后删除事件,但实际上并没有任何删除。 – user1777914

回答

0

如解释here它确实不会调用每个项目的delete()方法,但它会调用信号。我不知道这是否可能,但我也同意应该至少有一些选项en queryset.delete()来跳过信号执行。

+0

你说得对,删除操作确实需要一些调整。如果我只想要批量删除选项,总是使用“第一路径”而不是调用信号等。看起来像现在唯一的选择将是一个原始查询。 – user1777914

+0

显然,[this](https://code.djangoproject.com/ticket/9519)是与此功能相关的长期公开门票。你是对的,原始查询似乎是目前唯一的选择:-(自动检测快速路径的作品,如果你没有'pre_delete'或'post_delete'定义但跳过信号不是可选的 – serguitus

+0

我找到了一个工作,得到类似的行为,我只是删除了post_delete信号,并将该代码放在一个自定义的delete()方法中,这样,当你擦除一个对象('''object.delete()''')时,最初在信号中的代码被执行,但是当你执行QuerySet.delete()时,因为它不调用object.delete(),所以你得到了该代码。 – serguitus