python - .aggregate() 中使用的 Django @property
问题描述
我正在尝试从模型中聚合整数列表。整数派生的字段是@property
装饰器字段。装饰器按预期工作template.html
,如果直接传递,则在 内显示没有问题。但是,如果我尝试通过传递给 throws的上下文传递该@property
字段,则该错误基本上说后面是一个不包含任何装饰器字段的模型字段列表。 .aggregate()
template
Cannot resolve keyword 'sum_thing' into field.
我的问题是 - 你如何从模型中聚合(总和)派生字段?
#models.py
class Foo(models.Model):
a = 10 # a & b are both
b = 5 # models.IntegerField() items
@property
def sum_thing(self):
return self.a - self.b
#views.py
class Bar(generic.ListView):
def get_context_data(self, **kwargs):
qs = Foo.object.all()
totals = {}
totals['sumthing'] = qs.aggregate(total=Sum('sum_thing')
context = {
'totals': totals
}
return context
** 我已经大大简化了models.py
和views.py
。
解决方案
您不能使用属性进行聚合,因为它在数据库中不存在。但是,您可以在 DjangoF
表达式的帮助下对查询进行注释,以获取这些字段的实际值。请参见下面的示例。
from django.db.models import F, Sum
Foo.objects.annotate(sum_a_and_b=F('a') + F('b')).aggregate(total=Sum('sum_a_and_b'))
您也可以使用 F 进行任何数学运算,例如 / * + -,您也可以这样做
.annotate(answer=F('a') + F('b') * 2)
推荐阅读
- html - 如何在 django 的新视图中显示单击的项目/图像?
- excel - 使用 vba 将数据粘贴到下一个空列中
- highcharts - Highcharts - 具有数千个项目的树形图中的异步向下钻取
- python - 如何在这种 python 正则表达式情况下指定非贪婪模式?
- python - Python-BeautifulSoup:如何将 html 保存到数据库中?
- java - 如何在 AWS 上托管 nanohttpd java 应用程序?
- opengl - SSAO 和阴影映射 | 阴影不适用于 SSAO
- python - pyodbc execute variable becomes @P1
- bash - curl 以速率限制发布音频数据
- c++ - C++ 模板:无法匹配可变参数类模板中的最后一个模板