首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.aggregate()中使用的Django @属性

.aggregate()中使用的Django @属性
EN

Stack Overflow用户
提问于 2018-05-15 03:22:41
回答 2查看 3.8K关注 0票数 4

我试图从一个模型中聚合一个整数列表。从整数导出的字段是@property修饰符字段。装饰器按预期工作,在template.html中工作,如果直接传递,则显示没有问题。但是,如果我尝试将@property字段传递给.aggregate(),传递给template的上下文会抛出一个错误,基本上是Cannot resolve keyword 'sum_thing' into field.,后面是不包含任何装饰符字段的模型字段列表。

我的问题是--如何从模型中聚合(和)派生字段?

代码语言:javascript
运行
复制
#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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-15 03:45:28

由于数据库中不存在属性,因此无法使用属性进行聚合。但是,您可以借助Django的F表达式对查询进行注释,以获得这些字段的实际值。参见下面的示例。

代码语言:javascript
运行
复制
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,你也可以这样做

代码语言:javascript
运行
复制
.annotate(answer=F('a') + F('b') * 2)
票数 12
EN

Stack Overflow用户

发布于 2022-07-31 04:51:28

真正的方法是使用注释,正如Andrey所说,无论如何,当使用复杂属性时不能在注释中计算,您可以使用django-queryable属性

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50341867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档