在我的models.py中,我有以下示例:
**Orders**
id
product
total_gross
**Payments**
id
status
order_ID
如果确认付款状态,我将创建以下查询集以获取总金额。因此,我使用以下内容:
week_order_total = Order.objects.prefetch_related('payments').filter(created__range=(week_start_date, week_end_date)).filter(payments.status='confirmed').aggregate(Sum('total_gross'))['total_gross__sum']
我收到以下错误:
关键字不能是表达式
答案 0 :(得分:2)
过滤payments.status
无效。您可以使用两个连续的下划线(__
)对相关模型进行过滤:
week_order_total = Orders.objects.filter(
created__range=(week_start_date, week_end_date),
payments__status='confirmed'
).aggregate(Sum('total_gross'))['total_gross__sum']
使用.prefetch_related(…)
[Django-doc]并没有多大意义,因为.prefetch_related
仅在您在此处获得Orders
对象并且想要在Django / Python级别访问相关对象时才有效。但是在这里,您在数据库处进行聚合,因此Django将在SQL查询中移动聚合。
注意:通常,Django模型的名称为单数,因此
Order
代替了。Orders