1 回答
TA贡献1906条经验 获得超10个赞
使用 annotate() 方法
好像是不可能的。
当然,这是可能的 ;) 您可以使用子查询或一些巧妙的条件表达式。假设您想从上次订单操作中获取总金额,以下是子查询示例:
from django.db.models import Subquery, OuterRef
orders = Order.objects.annotate(
total=Subquery( # [1]
OrderOperation.objects \
.filter(order_id=OuterRef("pk")) \ # [2]
.order_by('-id') \ # [3]
.values('total') \ # [4]
[:1] # [5]
)
)
上面代码的解释:
我们正在向结果列表添加新字段,称为
total
taht 将由子查询填充。您可以Order
将此查询集中的任何其他模型字段访问它(在评估它之后,在模型实例中或在过滤和其他注释中)。您可以从Django 文档中了解注释的工作原理。子查询应该只针对当前订单的操作调用。
OuterRef
just 将被替换为对结果 SQL 查询中选定字段的引用。我们想按操作
id
降序排序,因为我们确实想要最新的。如果您的操作中有其他字段需要按顺序排序(例如创建日期),请在此处填写。该子查询应该只
total
从操作返回值我们只想要一个元素。它是使用切片符号而不是普通索引来获取的,因为在 django 查询集上使用索引将立即调用它。切片只是
LIMIT
向 SQL 查询添加子句,而不调用它,这就是我们想要的。
现在您可以使用:
orders.filter(total__lte=some_value)
只获取您想要的订单。您还可以使用该注释来
添加回答
举报