2013-07-19 5 views
2

Если у меня есть модель Книга определяется как:Django ORM: Агрегирование аннотаций поднимает DatabaseError

class Book(models.Model): 
    name = models.CharField(max_length=300) 
    pages = models.IntegerField() 
    price = models.DecimalField(max_digits=10, decimal_places=2) 
    rating = models.FloatField() 
    pubdate = models.DateField() 

и я выполнить запрос:

Book.objects.values('rating').annotate(books_per_rating=Count('id')).aggregate(Max('books_per_rating')) 

Я получаю DatabaseError.

В соответствии с этим https://docs.djangoproject.com/en/1.5/topics/db/aggregation/#aggregating-annotations Django поддерживает агрегирование аннотаций. Но в примере, приведенном в самой ссылке, они комментируют запрос QuerySet, который, в свою очередь, возвращает код QuerySet (а не ValuesQuerySet), поэтому агрегированный метод выполняется успешно. Но в моем примере агрегирование ValuesQuerySet вызывает DatabaseError.

Это ошибка в Django? Поскольку, если Django не поддерживает агрегацию более ValuesQuerySet, тогда он должен вызывать исключение на уровне Django (не DatabaseError).

Update:

Эта ошибка была решена здесь: https://code.djangoproject.com/ticket/20782

+0

Также интересно, если: 'Book.objects.values ​​('rating'). Aggregate (Max ('rating'))' Он возвращает пустой dict без выполнения каких-либо запросов БД !! –

ответ

1

Похоже, что вы столкнулись с ошибкой. Вы должны зарегистрировать это на django trac instance.

Укажите, какой DB Backend вы используете. Сейчас я тестирую sqlite, так как в настоящее время у меня нет доступа к другому серверу. Я упоминаю об этом, потому что я видел использование values().aggregate(), работающего во время поиска ответа на этот вопрос, поэтому он может быть просто ошибкой в ​​SQLite-компиляторе sql, который использует django.

Вот тест, который я использовал, и результат сгенерированного запроса.

>>> Stats.objects.values('created').annotate(num_days=Count('id')).aggregate(Max('num_days')) 
Traceback (most recent call last): 
DatabaseError: near "FROM": syntax error 
>>> print connection.queries[-1] 
{u'time': u'0.000', u'sql': u'SELECT FROM (SELECT "scratch_stats"."created" AS "created", COUNT("scratch_stats"."id") AS "num_days" FROM "scratch_stats" GROUP BY "scratch_stats"."created") subquery'} 

Edit:

Только что попробовал то же самое с Postgres и ту же ошибку. Появляется, вы не можете использовать aggregate с ValuesQuerySet.

Не работает на django 1.4, 1.5 и 1.6.

+1

, и если вы дадите мне 30 минут, я попробую тест на postgres –

+0

Я использовал postgres, но получил ошибку на sqllit (как вы тоже получаете). Спасибо за помощь :), я создам для этого новый билет. –

+0

Хорошая исследовательская работа, +1! – Matt

Смежные вопросы