我试图从一个模型中聚合一个整数列表。从整数导出的字段是@property
修饰符字段。装饰器按预期工作,在template.html
中工作,如果直接传递,则显示没有问题。但是,如果我尝试将@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
。
发布于 2018-05-15 03:45:28
由于数据库中不存在属性,因此无法使用属性进行聚合。但是,您可以借助Django的F
表达式对查询进行注释,以获得这些字段的实际值。参见下面的示例。
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)
发布于 2022-07-31 04:51:28
真正的方法是使用注释,正如Andrey所说,无论如何,当使用复杂属性时不能在注释中计算,您可以使用django-queryable属性。
https://stackoverflow.com/questions/50341867
复制相似问题