Модели 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 Я думаю, это причина.

Несколько вопросов:

  1. Есть ли лучший способ справиться с этой ситуацией, чтобы порядок наследования не имел значения?

  2. Является ли это подходящим способом решения данной ситуации?

  3. Если я хочу получить функциональность мягкого удаления в этом случае, я должен сначала импортировать ASoftDeletionModel?

Вернуться на верх