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