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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:03:18