首页 > 解决方案 > .aggregate() 中使用的 Django @property

问题描述

我正在尝试从模型中聚合整数列表。整数派生的字段是@property装饰器字段。装饰器按预期工作template.html,如果直接传递,则在 内显示没有问题。但是,如果我尝试通过传递给 throws的上下文传递该@property字段,则该错误基本上说后面是一个不包含任何装饰器字段的模型字段列表。 .aggregate()templateCannot 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.pyviews.py

标签: pythondjangopython-3.xdjango-views

解决方案


您不能使用属性进行聚合,因为它在数据库中不存在。但是,您可以在 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)

推荐阅读