I have a custom model manager on model such as:
class MyCustomManager(models.Manager):
def doFoo(self, user, s_format):
qs = super().get_queryset().filter(created_by=user)
return qs
which is returning data based on the user
passed as the argument. However, how would I go about adding more AND
conditions to the above query based on if
conditions? Something like this:
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
If I do the above, even if <condition 2>
is true, it's not generating created_by=1 AND mode='B'
SQL
I'm basically trying to do the equivalent of the following but split by conditions
qs = super().get_queryset().filter(created_by=user, mode='A')
CodePudding user response:
You need to reassign qs
in your conditions
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
CodePudding user response:
.filter(…)
[Django-doc] returns a new queryset, it does not alter qs
itself, you thus should assign the result to qs
again, or in this case return the queryset constructed by .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