如何使用Django ORM查询重写Raw SQL Query(MySQL)?

时间:2013-07-22 13:16:06

标签: python sql django

如何使用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 |

+---------------+-----

1 个答案:

答案 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