Дайте някакъв основен модел;
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'))
(или което и да е поле, any annotate()) се проваля със следната грешка:
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.
Както прочетох тук в друг въпрос за stackoverflow опитах различни версии на django и версии на postgres; използвайки django 2.0, 2.1.2, postgres 9.5.. същата грешка! Четейки наоколо, видях, че това може да е проблем, свързан със SQL, но имам този проблем само на един сървър, работещ с Ubuntu 18.04 (бионичен). Изпълнението на заявката локално в 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
на празна DB, така че схемата беше правилно създадена този път и проверена (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