如何防止添加到抽象模型中的管理器成为默认管理器?

时间:2019-03-14 14:01:19

标签: python django django-models

我们经常将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选作默认管理器吗?

1 个答案:

答案 0 :(得分:2)

Django将the first manager instance it finds on the model解释为默认管理器,因此请尝试:

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

    soft_deleted = BooleanField(default=False)

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