【发布时间】:2020-04-23 11:13:37
【问题描述】:
我的所有模型都有一个公共字段is_active = models.BooleanField()。
我想为删除函数创建一个通用覆盖,以便 is_active = False 而不是从数据库中删除记录。
我知道最好的方法是使用pre_delete 信号,而不是将delete() 本身覆盖为delete() is not called in bulk operations。
我尝试了以下实现:
@receiver(pre_delete)
def delete_obj(sender, instance, **kwargs):
"""Override delete() to set object to inactive."""
return instance.is_active == False
但是,这仍然会导致从数据库中删除对象。我认为这是因为delete() 在pre_delete 之后仍然被调用。我该如何纠正这个问题?
来自文档:
请注意,当使用 QuerySet 批量删除对象或作为级联删除的结果时,不一定会调用对象的 delete() 方法。为确保执行自定义删除逻辑,您可以使用 pre_delete 和/或 post_delete 信号。
【问题讨论】:
-
我认为唯一可能的方法是覆盖
delete函数。如果删除是通过关系级联的,您可能还需要考虑这种情况。 -
@adnanmuttaleb 谢谢,但如果我批量删除查询集中的项目,那将无济于事,因为那时不会调用
delete()。 -
可以使用 pre_delete 但不是重新发明轮子,您可以使用 django-model-utils.readthedocs.io/en/latest/…
-
@iklinac 谢谢这很有帮助,如果可能的话,我想了解这个问题背后的原因以及修复它的代码/语法。
-
@alias51 进行批量操作,您可以遍历您的查询集并手动调用您的自定义
delete方法。这当然性能较差,但会保持数据完整性。
标签: django django-signals