django filter items by query params if one param is None

Viewed 95

I have get request GET /themes with query params: category_id: integer level: integer

it's maybe GET /themes?category_id=1&level=1 or GET /themes?category_id=1 etc

So I need get items by filter:

def get(self, request):
    query = request.GET
    category_id = query.get('category_id')   # return value or None
    level = query.get('level')               # return value or None
    items = Theme.objects.all()
    qs = items.filter(category_id=category_id, level=level)

But category_id and level can be None, and I need change code qs = items.filter(category_id=category_id, level=level) if params is None

My code:



if category_id and level:
    qs = items.filter(category_id=category_id, level=level)
elif not category_id and level:
    qs = items.filter(level=level)
elif category_id and not level:
    qs = items.filter(category_id=category_id)
else:
    qs = items.filter()

But I think it's a terrible code.

1 Answers

You can work with two checks:

qs = items
if category_id:
    qs = qs.filter(category_id=category_id)
if level:
    qs = qs.filter(level=level)

But I would advise using django-filter [GitHub]: this has more support for this, and can easily render a form to help you render a filter at the frontend of your app.

Related