Django三表Inner Join查询:按center_id过滤并获取指定字段
解决方案
方法一:使用select_related预取关联对象
Django的select_related会自动执行Inner Join查询,一次性拉取关联的Center和Project对象,避免后续访问关联字段时触发额外数据库请求。修改你的get_queryset方法如下:
def get_queryset(self): return Institute.objects.filter(Center_id=self.kwargs['pk'])\ .select_related('Center', 'Center__Project')\ .order_by('InstituteName')
后续在视图或模板中访问所需字段时,直接通过对象属性链式调用即可:
- 项目名称:
instance.Center.Project.ProjectName - 项目编码:
instance.Center.Project.ProjectCode - 中心名称:
instance.Center.CenterName - 中心编码:
instance.Center.CenterCode - 机构名称:
instance.InstituteName - 机构编码:
instance.InstituteCode
方法二:使用values直接返回包含所有字段的字典
如果只需要获取特定字段的原始数据(无需模型对象实例),可以用values方法指定所有目标字段,Django会自动生成对应的Inner Join查询:
def get_queryset(self): return Institute.objects.filter(Center_id=self.kwargs['pk'])\ .values( 'InstituteName', 'InstituteCode', 'Center__CenterName', 'Center__CenterCode', 'Center__Project__ProjectName', 'Center__Project__ProjectCode' )\ .order_by('InstituteName')
这种方式返回的是字典列表,每个字典包含你指定的全部字段,示例返回结构如下:
[ { 'InstituteName': 'XX机构', 'InstituteCode': 'INST001', 'Center__CenterName': 'XX中心', 'Center__CenterCode': 'CENTER001', 'Center__Project__ProjectName': 'XX项目', 'Center__Project__ProjectCode': 'PROJ001' } ]
补充说明
select_related适合需要操作模型对象的场景,能保留模型的方法与属性。values适合仅需原始数据的场景,返回结果更轻量化。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

