Django queryset获取相关字段名称以过滤总和

时间:2020-09-12 20:48:01

标签: django django-queryset

在我的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']

我收到以下错误:

关键字不能是表达式

1 个答案:

答案 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