如何获得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的类型不相同,则可能需要使用具有特定output_fieldExpressionWrapper

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

文件:

  • https://docs.djangoproject.com/en/4.0/ref/models/querysets/#django.db.models.query.QuerySet.annotate
  • https://docs.djangoproject.com/en/4.0/topics/db/aggregation/
  • https://docs.djangoproject.com/en/4.0/ref/models/expressions/#using-f带符号

最新更新