“django orm”的等效值;把每一个(某事物)按某事物分组。”;

“django orm”的等效值;把每一个(某事物)按某事物分组。”;,django,django-orm,django-postgresql,Django,Django Orm,Django Postgresql,假设我有一个带有三个字段的模型“Book”:name、author\u name(作为字符串)、publish\u state。 现在我想找出哪位作者恰好出版了一本书。此sql查询完全符合我的要求: SELECT author_name from books GROUP BY author_name HAVING count(name) = 1 and every(publish_state = 'published'); 我用的是Postgres,你可以用“every”子句来形容 在djan

假设我有一个带有三个字段的模型“Book”:name、author\u name(作为字符串)、publish\u state。 现在我想找出哪位作者恰好出版了一本书。此sql查询完全符合我的要求:

SELECT author_name from books GROUP BY author_name HAVING count(name) = 1 and every(publish_state = 'published');
我用的是Postgres,你可以用“every”子句来形容


在django ORM中有这样做的方法吗?或者我需要使用原始查询吗?

可能有更好的方法,但至少您可以执行以下操作

books = Book.objects.filter(publish_state='published')
authors = {}

for book in books:
    authors.setdefault(book.author, 0)
    authors[book.author] += 1

rookies = [x for x, y in authors.iteritems() if y == 1]

Django在
注释之后使用
filter()
时使用having子句,比如
注释(foo=Count('bar'))。filter(foo_ugt=3)
。添加
values\u list
distinct
这样,您应该很好:

Book.objects.filter(publish_state='published').values_list('author_name',  flat=True).order_by('author_name').annotate(count_books=Count('name')).filter(count_books=1).distinct()

不幸的是,这个特性并没有在django的ORM中实现,我认为这不会很快实现,因为它不是一个非常常见的查询

我不得不使用原始SQL。你可以在这里找到它:

是的。这在技术上是正确的,但我一直在寻找数据库方法。这是不对的!您的查询包含拥有许多书籍的作者,但其中只有一位已发布。我需要那些只有一本书的人,而这本书已经出版了。然后只需将publish_state的过滤器移动到注释过滤器之后。不幸的是(但并不奇怪),Django将那些过滤器(位于
注释
之后)也放在
WHERE
子句中,而不是我需要的
HAVING
子句中。