我正在为我的Django项目构建软删除功能。我已经使用自定义模型管理器实现了此操作(即在get_queryset()
上执行初始过滤,再加上Model
/ Manager
/ QuerySet
delete()
。
Django文档(1.11):
如果您使用自定义Manager对象,请注意,第一个Django Django遇到的经理(按在模型中定义的顺序)具有特殊状态。 Django将类中定义的第一个Manager解释为“默认” Manager,并且Django的某些部分(包括dumpdata)将对该模型专用。因此,最好谨慎选择默认管理器,以免出现覆盖get_queryset()导致无法检索要使用的对象的情况。
我的软删除荣誉管理器当前是模型的默认管理器(在模型类上声明的第一个管理器)。它也已分配给objects
。
这对我来说很方便,因为许多Django代码使用默认的模型管理器(例如,如果MultipleObjectMixin.get_queryset()
继承的MultipleObjectMixin
仅定义了View
属性,则model
)。
但是dumpdata
也使用自定义模型管理器的事实使我感到恐惧,让我思考设置默认模型管理器的其他未知意外后果。如果执行manage.py dumpdata
,我希望将软删除的模型包含在转储中。因此,我开始怀疑自己在覆盖默认模型管理器以筛选可用记录时所选择的内容。
同时,我感谢设置默认模型管理器给我带来的便利(对通用CBVs.etc的零努力支持),如果可能的话,我希望对其进行维护。
解决此问题的最佳方法是什么?
答案 0 :(得分:4)
根据此documentation,如果您运行./manage.py dumpdata -a
或./manage.py dumpdata --all
,则它将使用默认管理器而非自定义管理器转储数据。如果要使用默认管理器而不是自定义管理器(不更改模型),则可以尝试如下操作:
objects = YourModel._base_manager
objects.all()