Модели Django - наследуются от двух классов: каждый с пользовательским Manager?
У меня возникла проблема, когда у меня есть Model
, который наследуется от двух других AbstractModel
классов.
Оба из AbstractModel
используют пользовательский Manager
для направления всех запросов к определенной базе данных.
Вот первый Model
:
# appA / models.py
class AbstractA(models.Model):
objects = managers.AManager()
class Meta:
abstract = True
# appA / managers.py
class AManager(models.Manager):
def get_queryset(self):
return super(AManager, self).get_queryset().using("database_a")
Это вторичный Model
, который я использую для выполнения "мягких удалений" (из этой статьи)
# appA / models.py
class ASoftDeletionModel(models.Model):
deleted_at = models.DateTimeField(blank=True, null=True)
objects = SoftDeletionManager()
all_objects = SoftDeletionManager(alive_only=False)
class Meta:
abstract = True
def delete(self):
self.deleted_at = timezone.now()
self.save()
def hard_delete(self):
super(ASoftDeletionModel, self).delete()
# appA / managers.py
class SoftDeletionManager(models.Manager):
def __init__(self, *args, **kwargs):
self.alive_only = kwargs.pop("alive_only", True)
super(SoftDeletionManager, self).__init__(*args, **kwargs)
def get_queryset(self):
if self.alive_only:
return (
SoftDeletionQuerySet(self.model)
.using("database_a")
.filter(deleted_at=None)
)
return SoftDeletionQuerySet(self.model).using("database_a")
def hard_delete(self):
return self.get_queryset().using("database_a").hard_delete()
class SoftDeletionQuerySet(models.QuerySet):
def delete(self):
return super(SoftDeletionQuerySet, self).update(
deleted_at=timezone.now(),
using="database_a",
)
def hard_delete(self):
return super(SoftDeletionQuerySet, self).delete(using="database_a")
def alive(self):
return self.using("database_a").filter(deleted_at=None)
def dead(self):
return self.using("database_a").exclude(deleted_at=None)
Я создал еще одну простую модель для создания комментариев к вещи, которая наследуется от обеих этих моделей следующим образом:
class Comment(
ASoftDeletionModel, AbstractA
):
thing = models.ForeignKey(
Thing, on_delete=models.PROTECT, related_name="%(class)ss"
)
comment = models.TextField()
class Meta:
ordering = ["-created_at"]
def __str__(self):
"""Unicode representation of Evidence."""
return self.comment
Если я изменю порядок наследования на такой: AbstractA, ASoftDeletionModel
это ломает ситуацию. Мне больше не возвращается SoftDeletionQueryset
, только стандартный django Queryset
Потому что они оба переопределяют get_queryset
Я думаю, это причина.
Несколько вопросов:
Есть ли лучший способ справиться с этой ситуацией, чтобы порядок наследования не имел значения?
Является ли это подходящим способом решения данной ситуации?
Если я хочу получить функциональность мягкого удаления в этом случае, я должен сначала импортировать
ASoftDeletionModel
?