如何将指定SQL查询语句转换为Django ORM语句?
将目标SQL转换为Django ORM语句
前提:确认模型关联
首先保证你的Django模型和数据库表对应,且已建立正确的外键关联:
from django.db import models class Product(models.Model): # 产品字段(如名称、价格等) class Meta: db_table = "app_product" class Order(models.Model): product = models.ForeignKey( Product, on_delete=models.CASCADE, related_name="orders", # 反向关联名称,用于从Product查Order db_column="product_id" ) # 订单字段(如创建时间、金额等) class Meta: db_table = "app_order"
对应ORM查询语句
原SQL是左连接app_order后按app_product.id分组,提取产品ID。在Django ORM中,通过annotate()触发分组和左连接,写法如下:
# 执行查询并获取产品ID列表 product_ids = Product.objects.values("id").annotate( # 用Count触发左连接,即使不需要统计结果,也能实现原SQL的分组逻辑 order_count=models.Count("orders") ).values_list("id", flat=True)
关键逻辑说明:
values("id")指定按产品ID分组annotate(models.Count("orders"))会自动生成与Order表的左连接(因为是反向关联),并完成分组操作values_list("id", flat=True)将结果转为扁平化的ID列表,和原SQL的输出一致
简化写法(如果仅需产品ID)
原SQL的查询结果和直接获取所有产品ID完全等价(分组后每个ID仅出现一次),所以如果不需要关联订单的额外数据,也可以直接写:
product_ids = Product.objects.values_list("id", flat=True)
内容的提问来源于stack exchange,提问作者chandan bagwan
相关产品推荐
相关产品推荐

