【发布时间】:2019-05-01 09:30:52
【问题描述】:
我正在为我的 Django 项目构建软删除功能。我已经使用自定义模型管理器实现了这一点(即在 get_queryset() 上执行初始过滤器,并覆盖 Model / Manager / QuerySet delete()。
Django 文档(1.11):
如果您使用自定义 Manager 对象,请注意 Django 遇到的第一个 Manager 对象(按照它们在模型中定义的顺序)具有特殊状态。 Django 将类中定义的第一个管理器解释为“默认”管理器,Django 的几个部分(包括转储数据)将专门为该模型使用该管理器。因此,最好谨慎选择默认管理器,以避免覆盖 get_queryset() 导致无法检索您想要使用的对象的情况。
我的软删除荣誉管理器当前是我模型的默认管理器(在模型类上声明的第一个管理器)。它也分配给objects。
这对我来说很方便,因为很多 Django 代码使用默认模型管理器(例如,MultipleObjectMixin.get_queryset(),如果您的 MultipleObjectMixin-inheriting View 只定义了 model 属性)。
然而,dumpdata 也 使用自定义模型管理器这一事实让我感到害怕,并让我想到了设置默认模型管理器的其他未知的意外后果。如果我执行manage.py dumpdata,我希望我的软删除模型包含在转储中。所以我开始怀疑自己是否选择覆盖默认模型管理器来过滤可用记录。
同时,我很欣赏设置默认模型管理器给我带来的便利(对通用 CBVs.etc 的零努力支持),如果可能的话,我想维护它。
解决这个问题的最佳方法是什么?
【问题讨论】: