首页 > 解决方案 > Django 查询集获取相关字段名称以过滤聚合总和

问题描述

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

我收到以下错误:

关键字不能是表达式

标签: djangodjango-queryset

解决方案


过滤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.


推荐阅读