如何在 Django 中进行条件查询?
How to make a conditional query in 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
表达式
您想按依赖于其他值的值排序,所以我们使用 F Expression (because sales_price
depends on other fields) in a conditional expression(因为最终表达式取决于 discount
是否为 NULL
)
首先我们构造一个依赖于discount
和price
的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)
我正在尝试按计算字段进行筛选,其中的计算取决于其他字段的值。
我正在尝试按 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
表达式
您想按依赖于其他值的值排序,所以我们使用 F Expression (because sales_price
depends on other fields) in a conditional expression(因为最终表达式取决于 discount
是否为 NULL
)
首先我们构造一个依赖于discount
和price
的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)