假设我有一个模型"Book",它有三个字段:name、author_name(作为字符串)和publish_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在像annotate(foo=Count('bar')).filter(foo__gt=3)
一样在annotate
之后使用filter()
时使用have子句。像这样加上values_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。你可以在这里找到它:https://docs.djangoproject.com/en/1.7/topics/db/sql/