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

如何将指定关联查询SQL转换为等效的Django ORM查询

前提模型约定

你需要先保证Django模型的关联关系定义和数据表对应,参考模型定义如下:

from django.db import models
# 如使用自定义用户模型,替换为你自己的User模型引入路径
from django.contrib.auth import get_user_model
User = get_user_model()

class DialogMessage(models.Model):
    # 其余原有字段按实际情况保留
    dialog_id = models.IntegerField()
    sender = models.ForeignKey(
        User, 
        on_delete=models.CASCADE, 
        db_column="sender_id",
        # 如果User表主键为user_id而非默认id,添加下一行
        # to_field="user_id"
    )
    receiver = models.ForeignKey(
        User, 
        on_delete=models.CASCADE, 
        db_column="receiver_id",
        # 如果User表主键为user_id而非默认id,添加下一行
        # to_field="user_id"
    )
    class Meta:
        db_table = "dialog_messages"

对等ORM查询

from django.db.models import F

# 替换为实际要查询的dialog_id值
target_dialog_id = 123

result_queryset = DialogMessage.objects.filter(
    dialog_id=target_dialog_id
).select_related(
    "sender", "receiver"
).annotate(
    sender_first_name=F("sender.first_name"),
    sender_last_name=F("sender.last_name"),
    sender_cell_number=F("sender.cell_number"),
    sender_avatar_full_path=F("sender.avatar_full_path"),
    receiver_first_name=F("receiver.first_name"),
    receiver_last_name=F("receiver.last_name"),
    receiver_cell_number=F("receiver.cell_number"),
    receiver_avatar_full_path=F("receiver.avatar_full_path")
).order_by("-id")

# 如需获取和原生SQL结构一致的字典列表,调用:
# result_dict_list = list(result_queryset.values())
# 如需直接操作模型实例,可直接遍历result_queryset,除了模型原有字段外,annotate生成的别名字段也可直接访问

校验说明

你可以通过执行print(result_queryset.query)打印生成的原生SQL,和你提供的SQL逻辑完全对齐:

  • select_related自动生成两张user表的INNER JOIN逻辑
  • annotate+F表达式对应SQL里的别名字段映射
  • 过滤、排序逻辑完全匹配

内容的提问来源于stack exchange,提问作者YOUNGHUNTER

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:24:03