首页 > 解决方案 > 如何防止添加到抽象模型中的管理器成为默认管理器?

问题描述

我们经常将soft_deleted字段添加到我们的模型中,以便将它们标记为已删除而不实际删除它们,以防用户/我们犯了错误并且我们想要撤消它,以及出于其他记录保存原因。

我想通过添加一个带有该字段的抽象模型类和一个管理器来获取未删除的对象(以及其他一些不相关的方法)来共同化这一点:

from django.db.models import Manager, Model


class UndeletedObjectsManager(Manager):
    def get_queryset(self):
        return self.model._default_manager.filter(soft_deleted=False)


class SoftDeletableModel(Model):
    class Meta:
        abstract = True

    soft_deleted = BooleanField(default=False)

    undeleted_objects = UndeletedObjectsManager()

但是,当我使用它时,根据我认为 MRO 顺序,有时undeleted_objects管理器最终成为默认管理器,而不是objects在另一个抽象模型类上定义,这意味着例如反向多对多管理器无法正常工作(他们过滤soft_deleted)。

我知道我可以设置default_manager_name所有子类模型,但这会重复很多次并且会破坏重构的部分要点。

有没有其他方法可以防止这种情况发生,并保证undeleted_objects不会被选为默认经理?

标签: pythondjangodjango-models

解决方案


Django 将它在模型上找到的第一个管理器实例解释为默认管理器,因此请尝试:

class SoftDeletableModel(Model):
    class Meta:
        abstract = True

    soft_deleted = BooleanField(default=False)

    objects = models.Manager()
    undeleted_objects = UndeletedObjectsManager()

推荐阅读