Как получить диапазон цен с помощью django?

у меня есть ценовая модель

class Product(models.Model):
  price = models.IntegerField
  membership_discount = models.DecimalField

если я получаю параметр цены, (например, min_price = 100000, max_price = 500000)

Я хочу получить продукты, умноженные на поля price и membership_discount.

не это

Product.objects.filter(price__range = (min_price, max_price))

я хочу

Product.objects.filter(price * (1+membership_discount)__range = (min_price, max_price))

lte = меньше или равно

gte = больше или равно

это документация: https://docs.djangoproject.com/en/4.0/ref/models/querysets/#gt

max_price = #max price logic here
min_price = #min price logic her

#this will filter all products (price <= max_price and price >= min_price)  
Product.objects.filter(price__lte = max_price, price__gte = min_price)

Вы можете использовать аннотации для QuerySet и применять фильтр по аннотации.

Product.objects.annotate(
    member_price=F('price') * (1 + F('membership_discount'))
).filter(
    member_price__range=(min_price, max_price)
)

Если поле price и поле membership_dicsount не имеют одинакового типа, вам может понадобиться использовать ExpressionWrapper с определенным output_field

Product.objects.annotate(
    member_price=ExpressionWrapper(
        F('price') * (1 + F('membership_discount')),
        output_field=DecimalField()
    )
).filter(
    member_price__range=(min_price, max_price)
)

Docs:

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