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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:50:01