如何在Django中进行条件查询

时间:2016-02-27 10:08:40

标签: python django django-orm

我试图按计算字段进行过滤,其中计算取决于其他字段的值。

我正在尝试按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)                                                                             

1 个答案:

答案 0 :(得分:6)

我只是指出你正确的方向:

FWhen

的条件表达式中使用Case个表达式

您希望按照取决于其他值的值进行排序,因此我们在F Expression中使用conditional expression(因为sales_price取决于其他字段)(因为最终表达式取决于discount是否为NULL

首先,我们构建一个sales_price值,该值取决于discountprice,并使用它注释我们的查询:

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)