我正在为我的Django项目构建软删除功能.我使用自定义模型管理器实现了这一点(即执行初始过滤get_queryset(),加上覆盖Model/ Manager/ QuerySet delete().
Django文档(1.11):
如果您使用自定义管理器对象,请注意第一个管理器Django遇到(按照它们在模型中定义的顺序)具有特殊状态.Django将类中定义的第一个Manager解释为"默认"管理器,Django的几个部分(包括dumpdata)将专门为该模型使用该Manager.因此,在选择默认管理器时要小心谨慎,以避免重写get_queryset()导致无法检索您想要使用的对象.
我的软删除管理程序管理器目前是我模型的默认管理器(在模型类上声明的第一个管理器).它也被分配给objects.
这对我来说很方便,因为很多Django代码都使用默认的模型管理器(例如,MultipleObjectMixin.get_queryset()如果你的MultipleObjectMixin-inheriting View只是model定义了属性).
然而,dumpdata 同样使用自定义模型管理器的事实吓坏了我,并让我考虑设置默认模型管理器的其他未知的意外后果.如果我执行a manage.py dumpdata,我希望我的软删除模型包含在转储中.因此,我开始怀疑自己选择覆盖默认模型管理器以过滤掉可用记录.
同时,我很欣赏设置默认模型管理器给我的便利(对通用CBVs.etc的零工作支持),如果可能的话我想维护它.
什么是最好的方法来解决这个问题?
根据本文档,如果您运行./manage.py dumpdata -a或./manage.py dumpdata --all,那么它将使用默认管理器而不是自定义管理器转储数据。如果您想使用默认管理器而不是自定义管理器(无需更改模型),那么您可以尝试如下:
objects = YourModel._base_manager
objects.all()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |