聚合函数返回AttributeError:'Sum'对象没有属性'lookup'

时间:2011-03-17 21:44:03

标签: django django-queryset

我正在尝试聚合函数,我得到了这个奇怪的结果(最新的官方Django 1.2版本)。 这是模型:

class Reputation(models.Model):
    user = models.ForeignKey(User)
    modifier = models.IntegerField()
    activity = models.ForeignKey(Activity)

这就是我得到的:

In [37]: Reputation.objects.aggregate(r=Sum('modifier'))
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)

C:\Data\Development\django_projects\oko\lib\site-packages\django\db\models\manager.pyc in aggregate(self, *args, **kwargs)
    142
    143     def aggregate(self, *args, **kwargs):
--> 144         return self.get_query_set().aggregate(*args, **kwargs)
    145
    146     def annotate(self, *args, **kwargs):

C:\Data\Development\django_projects\oko\lib\site-packages\django\db\models\query.pyc in aggregate(self, *args, **kwargs)
    315         for (alias, aggregate_expr) in kwargs.items():
    316             query.add_aggregate(aggregate_expr, self.model, alias,
--> 317                 is_summary=True)
    318
    319         return query.get_aggregation(using=self.db)

C:\Data\Development\django_projects\oko\lib\site-packages\django\db\models\sql\query.pyc in add_aggregate(self, aggregate, model, alias, is_summary)
    929         """
    930         opts = model._meta
--> 931         field_list = aggregate.lookup.split(LOOKUP_SEP)
    932         if len(field_list) == 1 and aggregate.lookup in self.aggregates:
    933             # Aggregate is over an annotation

AttributeError: 'Sum' object has no attribute 'lookup'

4 个答案:

答案 0 :(得分:5)

确保导入正确的Sum

from django.db.models import Sum

如果您导入django.db.models.sql.aggregates.Sum,则会继续看到该错误。

答案 1 :(得分:4)

根据您的帖子是通过谷歌搜索唯一提及该错误消息的事实判断,并且我可以通过使用名为Sum的随机类到聚合函数来重现您的错误,我认为您有一个代码中Sum的本地定义。

您在控制台会话的第37行。尝试重新开始,from django.db.models import Sumfrom myproject.myapp.models import Reputation,然后再查询。

答案 2 :(得分:0)

由于未能在注释中包含聚合函数,即

,我得到了同样的错误

错误:

Person.objects.annotate(ave_score='starred_in__score')

右:

Person.objects.annotate(ave_score=Avg('starred_in__score'))

我犯了一个愚蠢的错误,但我想我会在这里记录它,以防它帮助其他人。

答案 3 :(得分:0)

这与问题不完全相同,但是我在F中使用annotate遇到了几乎相同的错误(没有属性'lookup')。导入是正确的,但是在我使用Django 1.7时,在Django 1.8中添加了its use in annotate。如果您还使用旧版Django,则需要使用filter