【问题标题】:Should my soft-deletion-honouring model manager be my model's default manager?我的软删除模型管理器应该是我模型的默认管理器吗?
【发布时间】: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 的零努力支持),如果可能的话,我想维护它。

解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: python django


    【解决方案1】:

    根据documentation,如果您运行./manage.py dumpdata -a./manage.py dumpdata --all,那么它将使用默认管理器而不是自定义管理器转储数据。如果您想使用默认管理器而不是自定义管理器(不更改模型),那么您可以这样尝试:

    objects = YourModel._base_manager
    objects.all()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-21
      • 2012-06-24
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2010-12-05
      • 1970-01-01
      相关资源
      最近更新 更多