Django get_queryset() с условным фильтром()

У меня есть пользовательский менеджер моделей на модели, такой как:

class MyCustomManager(models.Manager):
   def doFoo(self, user, s_format): 
        qs =  super().get_queryset().filter(created_by=user)
        return qs

, который возвращает данные на основе user, переданных в качестве аргумента. Однако, как мне добавить больше AND условий к вышеупомянутому запросу на основе if условий? Что-то вроде этого:

class MyCustomManager(models.Manager):
       def doFoo(self, user, s_format): 
            qs =  super().get_queryset().filter(created_by=user)
            if <condition 1>:
                qs.filter(mode='A')
            elif <condition 2>:
                qs.filter(mode='B')
            return qs

Если я делаю вышеописанное, даже если <condition 2> истинно, он не генерирует created_by=1 AND mode='B' SQL

Я в основном пытаюсь сделать эквивалент следующего, но разделить по условиям

qs =  super().get_queryset().filter(created_by=user, mode='A')

.filter(…) [Django-doc] возвращает новый кверисет, он не изменяет qs сам себя, поэтому вы должны присвоить результат qs снова, или в этом случае вернуть кверисет, построенный .filter(…):

class MyCustomManager(models.Manager):
    def doFoo(self, user, s_format): 
        qs = super().get_queryset().filter(created_by=user)
        if <condition 1>:
            return qs.filter(mode='A')
        elif <condition 2>:
            return qs.filter(mode='B')
        return qs

Вам необходимо переназначить qs в ваших условиях

class MyCustomManager(models.Manager):
       def doFoo(self, user, s_format): 
            qs =  super().get_queryset().filter(created_by=user)
            if <condition 1>:
                qs = qs.filter(mode='A')
            elif <condition 2>:
                qs = qs.filter(mode='B')
            return qs
Вернуться на верх