在 Django 中使用带注释的查询集运行总计

Posted

技术标签:

【中文标题】在 Django 中使用带注释的查询集运行总计【英文标题】:Running total with annotated querysets in Django 【发布时间】:2014-10-26 19:19:28 【问题描述】:

我有一个运行的总模板标签,看起来像

from django.template import Library 

register = Library() 

@register.filter
def running_total(list, var_name):
    return sum(getattr(obj, var_name) or 0 for obj in list)

当我需要在普通查询集中运行总计时,它可以工作,但是当我使用带注释的查询集时,我得到了异常 'dict' object has no attribute 'total'

当我在模板中打印普通查询集时,我得到 [<Item: Item #1>],但是当我打印带注释的查询集时,我得到一个带有元组 ['total_amount': Decimal('0.00'), ...] 的列表。

我应该以某种方式转换模板标签中的列表吗?

我已经尝试添加

list = list(list)

但还是不行。

【问题讨论】:

使用比 list 更好的名称。您正在覆盖默认类型。 【参考方案1】:
arr = []
for obj in list:
    if isinstance(obj, dict):
        arr.append(obj[var_name] if var_name in obj else 0)
    else:
        arr.append(getattr(obj, var_name) or 0)
return sum(arr)

原因是带注释的查询集中的元素不再是模型实例,而是字典。

【讨论】:

以上是关于在 Django 中使用带注释的查询集运行总计的主要内容,如果未能解决你的问题,请参考以下文章

如何在带注释的 Django 查询集结果上列出字段值?

Django 查询集优化 - 防止选择带注释的字段

Django 使用注释更新查询集

按月、年分组的数据集运行总计

Django 运行缓慢的原因

在带注释的 FilteredRelation 上使用 exclude 不起作用?