Django filter queryset only if variable is not null

Question:

I have a queryset it filter by 2 variables

family = ModelsClass.objects.filter(foo=var1).filter(bar=var2)

If var1 and var2 are not null everything work but var1 and var2 can be Null.
In this case i need to exclude the Null one.

For example, if var1 is Null it must filter only by var2 and the other way around.

Is there a way to insert an if condition inside the filter queryset or something else?

TY

Asked By: JuConte

||

Answers:

Why don’t you check if variable is null and then filter it? You don’t have to do it in one line. Django’s queryset objects are lazy evaluated and you can filter or do other things in separate lines.

family_queryset = ModelClass.objects.all()

if var1:
    family_queryset = family_queryset.filter(foo=var1)

if var2:
    family_queryset = family_queryset.filter(bar=var2)
Answered By: Cagatay Barin

More generally, you can create a filter dictionary and filter the dictionary keys for null values using a dict comprehension.

filters = {
  'foo': var1,
  'bar': var2,
}
filters = {k:v for k,v in filters.items() if v is not None}
family_queryset = ModelClass.objects.filter(**filters)

You can even use if v instead of if v is not None to also exclude empty strings, for example.

Answered By: arcstur

A different approach using Q

Q object encapsulates a SQL expression in a Python object that can be used in database-related operations. Using Q objects we can make complex queries with less and simple code.

filters = Q()
if my_first_param:
   filters &= Q(my_first_param=my_first_param)
if my_second_param:
   filters &= Q(my_second_param=my_second_param)

# Perform filtration
family_queryset = ModelClass.objects.filter(filters)

Answered By: griffins
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.