如何将指定MySQL原生查询语句转换为Django ORM写法
MySQL语句转Django ORM实现方案
你提供的原生查询SQL如下:
SELECT * FROM student.student_data WHERE created_by IN (SELECT user_id FROM user_profile WHERE user_location IN(7, 8));
以下是两种符合Django ORM规范的实现方式,默认你已经完成了表和模型的映射:
StudentData模型映射student.student_data表,created_by字段对应表中同名字段UserProfile模型映射user_profile表,包含user_id、user_location字段
写法1:子查询实现(和原SQL逻辑完全对齐)
这种写法生成的执行SQL和你编写的原生SQL逻辑完全一致:
# 构造子查询获取符合位置要求的用户ID列表 target_user_ids = UserProfile.objects.filter(user_location__in=[7, 8]).values_list("user_id", flat=True) # 主查询筛选对应记录 query_result = StudentData.objects.filter(created_by__in=target_user_ids)
query_result默认返回所有字段的结果,等价于原SQL中的SELECT *效果。
写法2:关联查询简化写法
如果StudentData的created_by字段定义为关联UserProfile的外键,可直接用跨表查询语法简化代码:
query_result = StudentData.objects.filter(created_by__user_location__in=[7, 8])
Django会自动解析关联关系生成对应SQL,执行结果和原SQL完全一致。
内容的提问来源于stack exchange,提问作者Rahul Pagar
相关产品推荐
相关产品推荐

