0

假设我有一个模型“书”,其中包含三个字段:名称、作者姓名(作为字符串)、发布状态。现在我想找出哪些作者恰好有一本出版的书。这个 sql 查询完全符合我的要求:

SELECT author_name from books GROUP BY author_name HAVING count(name) = 1 and every(publish_state = 'published');

正如您可以通过“每个”子句所说的那样,我正在使用 Postgres。

有没有办法在 django ORM 中做到这一点?还是我需要为此使用原始查询?

4

3 回答 3

0

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

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]
于 2014-04-15T18:54:58.540 回答
0

当你在likefilter()之后使用时,Django 使用 having 子句。像这样添加,你应该很好:annotateannotate(foo=Count('bar')).filter(foo__gt=3)values_listdistinct

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()
于 2014-04-15T19:16:29.130 回答
0

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

我不得不使用原始 SQL。你可以在这里找到它: https ://docs.djangoproject.com/en/1.7/topics/db/sql/

于 2014-11-18T22:29:34.557 回答