.aggregate()中使用的Django @property

发布于 2021-01-29 15:05:19

我正在尝试从模型中汇总整数列表。整数派生的@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.pyviews.py

关注者
0
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您无法使用属性进行汇总,因为该属性在数据库中不存在。但是,您可以借助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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看