Django фильтрует элементы по параметрам запроса, если один параметр - None
У меня есть запрос GET /themes
с параметрами запроса:
category_id: integer
level: integer
это может быть GET /themes?category_id=1&level=1
или GET /themes?category_id=1
и т.д.
Мне нужно получить элементы по фильтру:
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)
Но category_id
и level
могут быть None, и мне нужно изменить код qs = items.filter(category_id=category_id, level=level)
если params is None
Мой код:
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()
Но я думаю, что это ужасный код.
Вы можете работать с двумя проверками:
qs = items
if category_id:
qs = qs.filter(category_id=category_id)
if level:
qs = qs.filter(level=level)
Но я бы посоветовал использовать django-filter
[GitHub]: он имеет больше поддержки для этого, и может легко вывести форму, чтобы помочь вам вывести фильтр во фронтенде вашего приложения.