如何使用Django ORM查询重写下一个Raw SQL Query(MySQL)?
mysql> select author_id,
count(*) c
from library_books
group by author_id
having c>2
limit 3;
+---------------+----+
| author_id | c |
+---------------+----+
| 0 | 39 |
| 1552 | 17 |
| 1784 | 8 |
+---------------+-----
答案 0 :(得分:2)
首先,annotate一个包含图书数量的作者查询集。
from django.db.models import Count
authors = Author.objects.annotate(num_books=Count('librarybook')
你没有展示你的Django模型,所以我不得不猜测'librarybook'是反向关系的正确名称。
然后在num_books
上过滤,找到包含两本以上图书的作者。
authors = Author.objects.annotate(num_books=Count('librarybook').filter(num_books__gt=2)
最后,将查询集切片以将其限制为3个结果。
authors = Author.objects.annotate(num_books=Count('librarybook').filter(num_books__gt=2)[:3]
然后,您可以遍历最终作者并访问书籍数量。
for author in authors:
print author.name, author.num_books