如何将指定关联查询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
相关产品推荐
相关产品推荐

