Django删除没有调用信号

时间:2014-03-11 15:15:49

标签: django django-models django-signals

我将信号用于在删除,保存,更新等对象时应始终执行的操作。但是,有时候我不想调用我的保存信号,所以我使用

Model.objects.filter(id=instance.id).update(field=value)

而不是实例的保存方法:

instance.save()

在删除对象的情况下,有时候我不想调用删除信号,但我还没有找到避免调用它们的方法。有办法吗?

更新

我正在使用django 1.6.2并调用这样的删除方法:

Model.objects.filter(id=instance.id).delete()

查询集上的

仍然仍然调用删除信号。

4 个答案:

答案 0 :(得分:0)

你可以这样做。

Model.objects.filter(id=instance.id).delete()

答案 1 :(得分:0)

不安全无证方式可能会在不同版本之间发生变化,也可能导致难以调试的意外后果

这是一个可能你不想使用的黑客,但......它是可能的。

qs = Model.objects.filter(id=instance.id)
qs.order_by().select_related(None)._raw_delete(qs.db)

如果你有任何相关的对象,它可能会因数据库错误而失败,因为Django不会自动删除记录

答案 2 :(得分:0)

在您不希望调用信号的位置,您必须断开它们,运行代码然后重新连接它们。你可以看看如何在FactoryBoy中实现mute_signal装饰器或者只是使用(但它主要用于django测试)

答案 3 :(得分:0)

尝试使用原始 SQL,不要抗拒它。它始终是您可以使用的强大终极武器。

from django.db import connection

with connection.cursor() as cursor:
    cursor.execute(f'DELETE from tbl_model where id={instance.id}')