Дайте ему любую базовую модель, скажем;
class Post(models.Model):
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(_('Title'), max_length=100)
content = models.TextField(_('Content html'), max_length=65000)
author = models.ForeignKey('user.User', on_delete=models.SET_NULL)
Запрос типа Post.objects.annotate(Count('id'))
(или любого поля, любой аннотации()) завершается со следующей ошибкой:
ProgrammingError: column "post.created" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "post"."id", "post"."created", "post"."ti...
Использование django 1.11.16 и postgres 9.4.19.
Как я прочитал здесь в другом вопросе о переполнении стека пробовал разные версии django и версии postgres; используя django 2.0, 2.1.2, postgres 9.5.. та же ошибка! Читая, я видел, что это может быть проблема, связанная с SQL, но у меня эта проблема только на одном сервере с Ubuntu 18.04 (bionic). Выполнение запроса локально в Ubuntu 16.04, с django 1.11.16 или любой версией выше и postgres 9.4 или выше работает нормально в моей локальной системе. Таким образом, проблема может быть связана с каким-то низким уровнем возможно, библиотеки, я не запускаю сложные запросы, любой простой annotate() с django 1.11+ не работает в Ubuntu 18.04 с postgres 9.4 или 9.5
[ОБНОВЛЕНИЕ] Может быть полезно для вас, если вы обнаружите, что находитесь в этом сценарии и не понимаете, что происходит, убедитесь, что для рассматриваемой таблицы созданы индексы. Моя проблема оказалась в том, что таблица posts
не имела ни определения PRIMARY KEY
, ни каких-либо других ограничений, сбой в pg_restore
, который восстановил все данные и некоторые определения схемы, да, вы правильно прочитали, какая-то другая схема определения отсутствовали, понятия не имею, почему.. Но вместо того, чтобы пытаться отлаживать то, что произошло с pg_restore
, я запустил начальный python manage migrate
в пустой БД, чтобы на этот раз схема была правильно создана и проверена (psql -d <db_name> -c '\d posts'
), затем снова запустите pg_restore
с флагами --data-only
и --disable-triggers
. Итак, наконец, я правильно восстановил схему и данные, и запрос сработал.
print(Post.objects.annotate(Count('id')).query)
? Это будет запрос sql из вашего набора запросов. - person Håken Lid   schedule 24.10.2018id
s при аннотировании, так как каждая строка содержит одну запись, и, следовательно, счетчик всегда 1 (или0
в случаеNULL
. - person Willem Van Onsem   schedule 24.10.2018