Функции агрегирования возвращают AttributeError: у объекта 'Sum' нет атрибута 'lookup' - PullRequest
1 голос
/ 18 марта 2011

Я опробую функции агрегации и получаю странные результаты (последний официальный релиз 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 ]

5 голосов
/ 18 августа 2013

Убедитесь, что вы импортируете правильные Sum:

from django.db.models import Sum

Если вы импортируете django.db.models.sql.aggregates.Sum, вы по-прежнему будете видеть эту ошибку.

4 голосов
/ 18 марта 2011

Судя по тому, что ваше сообщение является единственным упоминанием этого сообщения об ошибке через поиск в Google, и что я могу воспроизвести вашу ошибку, используя случайный класс с именем Sum в функции агрегирования, я думаю, что у вас есть локальное определениеSum в вашем коде.

Вы находитесь на 37-й строке вашего консольного сеанса.Попробуйте начать заново, from django.db.models import Sum, from myproject.myapp.models import Reputation, затем запрос.

0 голосов
/ 11 февраля 2019

Это не совсем то, о чем идет речь, но я столкнулся с почти той же ошибкой (без атрибута 'lookup'), используя F в annotate. Импорт был корректным, но его использование в annotate было добавлено в Django 1.8, в то время как я использую Django 1.7. Вам нужно будет использовать filter вместо этого, если вы также используете этот старый релиз Django.

0 голосов
/ 22 ноября 2012

Я получил ту же ошибку, не включив функцию агрегирования в аннотацию, т.е.

неправильно:

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

право:

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

Глупая ошибка с моей стороны, но я решил документировать ее здесь на случай, если она кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...