Фильтрация набора 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])
Вернуться на верх