Мы часто добавляем поля 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
не будет выбран в качестве менеджера по умолчанию?