Как предотвратить добавление менеджера, добавленного в абстрактную модель, по умолчанию? - PullRequest
1 голос
/ 14 марта 2019

Мы часто добавляем поля 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 Ответ

2 голосов
/ 14 марта 2019

Django интерпретирует первый экземпляр менеджера, который он находит в модели , как менеджер по умолчанию, поэтому попробуйте:

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

    soft_deleted = BooleanField(default=False)

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