You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:48:15