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]: он имеет больше поддержки для этого, и может легко вывести форму, чтобы помочь вам вывести фильтр во фронтенде вашего приложения.

Вернуться на верх