Фильтрация набора queryset в зависимости от входящих параметров?
У меня есть параметры фильтра, которые я получаю через GET-запрос. Эти параметры используются для фильтрации QuerySet:
class FilterData(TypedDict):
title: str
min_price: int
max_price: int
freeDelivery: bool
available: bool
tags: list[int | None]
Как видите, список тегов может быть пустым, и это поле не должно присутствовать в запросе фильтра. Итак, как лучше всего изменить запрос фильтра в зависимости от входящих параметров?
if
может помочь, но я не уверен, что это хорошее решение:
if not tags:
result = Product.objects.filter(
Q(
price__gte=filter_data["min_price"],
price__lte=filter_data["max_price"],
)
& Q(freeDelivery=filter_data["freeDelivery"])
& Q(available=filter_data["available"])
& Q(title__icontains=filter_data["title"]))
).order_by(order_field)
else:
result = Product.objects.filter(
Q(
price__gte=filter_data["min_price"],
price__lte=filter_data["max_price"],
)
& Q(freeDelivery=filter_data["freeDelivery"])
& Q(available=filter_data["available"])
& Q(title__icontains=filter_data["title"])
& Q(tags__contains=[1, 2, 3])
).order_by(order_field)
Thx.
Чтобы не повторяться, можно сделать так:
filters = Q( ... ) # all the filters except tags
if tags:
filters &= Q(tags__contains=[1, 2, 3])
result = Product.objects.filter(q).order_by(order_field)
Альтернативно можно просто использовать filter
методы:
result = Product.objects.filter(price__gte=filter_data["min_price"], ...).order_by(order_field)
if tags:
result = result.filter(tags__contains=[1, 2, 3])