Как наследовать несколько фильтров наборов запросов через миксины - PullRequest
2 голосов
/ 08 января 2020

У меня есть QuerySetMixin в менеджере моделей:

models.py:

class MyModel(models.Model):
    objects = SoftDeletableManager()

Manager.py:

class SoftDeletableManager(SoftDeletableManagerMixin, models.Manager):
    pass

class SoftDeletableQuerySet(QuerySet):
    pass

class SoftDeletableManagerMixin:
    _queryset_class = SoftDeletableQuerySet

    def get_queryset(self):
         return self._queryset_class(
             model=self.model, 
             using=self._db,
             **kwargs).filter(is_removed=False)

Я хочу определить второй QuerySetMixin, который наследует результаты SoftDeletableManagerMixin и фильтрует их. Как мне это сделать?

Например

class MyManagerMixin:

    def get_queryset(self):
        return self.[inherit other querysets].filter(mynewfilter=True)

1 Ответ

1 голос
/ 08 января 2020

Если вы унаследовали его, вы можете использовать super() прокси-объект :

class SoftDeletableManagerMixin:
    _queryset_class = SoftDeletableQuerySet

    def get_queryset(self):
         return <b>super().get_queryset()</b>.filter(is_removed=False)

то же самое для вашего второго миксина:

class MyManagerMixin:

    def get_queryset(self):
        return <b>super().get_queryset()</b>.filter(mynewfilter=True)

Затем вы можете создать менеджера с помощью:

class MyNewManager(<b>MyManagerMixin, SoftDeletableManagerMixin</b>, Manager):
    pass
...