如何在Django中进行条件查询
作者:互联网
我试图通过计算字段进行过滤,其中计算取决于其他字段的值.
我正在尝试按sales_price(计算字段)进行过滤,其中sales_price的定义如下面的伪代码
if discount is NULL
sales_price = price
else
sales_price = price - price*discount/100
最终目标是按范围过滤sales_price:
filter(sales_price__range=(price_min, price_max))
这是我的模型:
class Product(models.Model):
price = models.IntegerField()
discount = models.IntegerField(blank=True, null=True)
解决方法:
我只会指出你正确的方向:
在带有When和Case的条件表达式中使用F表达式
您希望按依赖于其他值的值进行排序,因此让我们在conditional expression中使用F Expression(因为sales_price取决于其他字段)(因为最终表达式取决于折扣是否为NULL)
首先,我们构建一个依赖于折扣和价格的sales_price值,并用它来注释我们的查询:
from django.db.models import When, Case, F, IntegerField
Product.objects.annotate(
sales_price=Case(
When(discount__isnull=True, then=F('price')),
When(discount__isnull=False, then=(F('price') - (F('discount') * F('price')) / 100)),
output_field=IntegerField(),
)
)
现在有了这个,你已经包含了一个可以过滤的sales_price:
Product.objects.annotate(...).filter(sales_price__range=(price_min, price_max)
标签:python,django,django-orm 来源: https://codeday.me/bug/20190824/1705887.html