如何将指定Django ORM查询语句转换为等价原生SQL语句
Django 统计出版社图书数ORM语句等价原生SQL
前提说明
Django 默认生成的数据表名遵循 {应用名}_{模型类名小写} 规则,图书表关联出版社的外键默认列名为 publisher_id。以下示例假设应用名为 book_cms,如果你的项目自定义了表名(通过模型Meta类的db_table参数)或外键列名,替换SQL中对应的表名、列名即可。
等价原生SQL写法
SELECT book_cms_publisher.id, book_cms_publisher.name, COUNT(book_cms_book.id) AS num_books FROM book_cms_publisher LEFT JOIN book_cms_book ON book_cms_publisher.id = book_cms_book.publisher_id GROUP BY book_cms_publisher.id, book_cms_publisher.name ORDER BY num_books DESC LIMIT 5;
逻辑对应说明
LEFT JOIN匹配ORM跨关联统计的默认逻辑:即使出版社没有关联任何图书,也会被纳入统计(对应图书数为0),不会被过滤COUNT(book_cms_book.id) AS num_books完全对应annotate(num_books=Count('book'))的聚合逻辑,统计每个出版社关联的有效图书数量GROUP BY按出版社维度分组,是聚合统计的标准要求ORDER BY num_books DESC对应order_by('-num_books')的按图书数降序排序规则LIMIT 5对应QuerySet切片[:5]取前5条记录的逻辑
校验提示:你可以直接在Django环境中执行
print(Publisher.objects.annotate(num_books=Count('book')).order_by('-num_books')[:5].query),打印当前项目配置下ORM实际生成的SQL语句,和上述写法做一致性校验。
内容的提问来源于stack exchange,提问作者William55
相关产品推荐
相关产品推荐

