I'm trying to create a django filter with multiple filter parameters (ex. name, age, height). However, I only want to filter by a parameter if it exists...
In my init:
def __init__(self, name=None, age=None, height=None):
self.name = name
self.age = age
self.height = height
in my query:
Person.objects.filter(name=self.name, age=self.age, height=self.height)
However, the problem is since the parameters are optional in the constructor, there is a chance that the filter is looking for None
values, which I don't want. If name='mike'
, age=25
, height=None
, I only want the filter to use the name
and age
parameters and exclude the height
. Something like:
Person.objects.filter(if self.name: name=self.name, if self.age: age=self.age, if self.height: height=self.height)
Is this possible? Or would I need to first check if every variable exists and have different cases for each possible filter query?
Thanks!
from django.db import models as dmodels
filters = dmodels.Q(age=age) & dmodels.Q(name=name)
if height:
filters &= dmodels.Q(height=height)
Person.objects.filter(filters)