【问题标题】:Django queryset getting the related field name to filter an aggregate sumDjango 查询集获取相关字段名称以过滤聚合总和
【发布时间】:2020-09-12 20:48:01
【问题描述】:

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

我收到以下错误:

关键字不能是表达式

【问题讨论】:

  • payments.status

标签: django django-queryset


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2018-05-12
    • 2023-01-16
    相关资源
    最近更新 更多