假设有一个基础模型,比如:
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。阅读了另一个stackoverflow问题,尝试了不同的django版本和postgres版本,使用django 2.0、2.1.2和postgres 9.5仍然出现相同的错误!阅读周围的资料,发现可能是与SQL相关的问题,但我只在运行Ubuntu 18.04(bionic)的一个服务器上遇到了这个问题。在我的本地系统中,使用django 1.11.16或任何版本以上的版本和postgres 9.4或以上的版本运行查询都可以正常运行,因此问题可能实际上与某些底层库有关,我没有运行复杂的查询,任何简单的annotate()在Ubuntu 18.04上与postgres 9.4或9.5一起使用都会失败 [更新]如果你处于这种情况而且不知道发生了什么,请验证涉及的表是否已经创建了索引。我的问题最终变成了
posts
表没有PRIMARY KEY
定义或其他限制,这是在pg_restore
中失败的,导致所有数据和一些模式定义被还原,是的,你没看错,一些其他的模式定义缺失了,不知道为什么。但是,我没有尝试调试发生了什么事情,而是在空数据库上运行了一个初始的python manage migrate
以便正确创建模式并进行验证(psql -d <db_name> -c '\d posts'
),然后再次使用--data-only
和--disable-triggers
标志运行pg_restore
,最终我成功地还原了模式和数据,并且查询也可以正常工作。
print(Post.objects.annotate(Count('id')).query)
的输出吗?那将是你的查询集的 SQL 查询。 - Håken Lidid
没有太多意义,因为每一行都包含一个记录,因此计数始终为1(如果是NULL
则为0
)。 - Willem Van Onsem