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

Django视图页如何将外键type_id替换为关联模型的name字段值

Django视图中外键ID替换为关联名称实现方法

你遇到的问题是调用QuerySet的.values()方法时,ForeignKey字段默认仅返回关联对象的主键ID值,不会自动返回关联表的其他字段,结合你需要用Pandas做数据处理的场景,有两种可直接落地的方案:


方案1:查询阶段直接拉取关联字段(性能最优,推荐)

Django ORM支持通过外键字段名__关联表字段名的语法跨表查询字段,你可以在.values()中直接指定需要返回的字段,一次性把所有关联表的名称字段查出来,不需要后续额外处理:

from django.shortcuts import render
from .models import *
import pandas as pd

def fabrications(request):
    lesfichestab = fiche.objects.all()
    # 跨表取关联字段,避免返回无用的ID值
    fabricationtab = fabrication.objects.all().values(
        'id',
        'composant_value',
        'grade__name',
        'type__name',  # 直接取composant_type关联的name值
        'composant__name',
        'unite__name'
    )
    df = pd.DataFrame(fabricationtab)
    # 把带__的字段名重命名为简洁名称,适配后续透视、筛选逻辑
    df = df.rename(columns={
        'grade__name': 'grade',
        'type__name': 'type',
        'composant__name': 'composant',
        'unite__name': 'unite'
    })
    # 此处可正常执行Pandas筛选、透视等操作
    context = {
        'lesfichestab': lesfichestab,
        'fabricationtab': df.to_html()
    }
    return render(request, 'fabrications/fabricationpage.html', context)

该方案仅执行一次关联查询SQL,没有额外数据库开销,性能最好。


方案2:Pandas阶段通过映射替换ID值

如果你需要保留type_id字段做其他逻辑处理,可以先查询全量数据,再通过ID和名称的映射字典在DataFrame中替换值:

from django.shortcuts import render
from .models import *
import pandas as pd

def fabrications(request):
    lesfichestab = fiche.objects.all()
    fabricationtab = fabrication.objects.all().values()
    df = pd.DataFrame(fabricationtab)
    # 构造type_id到name的映射字典
    type_name_map = dict(composant_type.objects.values_list('id', 'name'))
    # 将type_id列的值替换为对应名称,空值填充为空字符串
    df['type_id'] = df['type_id'].map(type_name_map).fillna('')
    # 重命名列名为type
    df = df.rename(columns={'type_id': 'type'})
    # 此处可正常执行Pandas筛选、透视等操作
    context = {
        'lesfichestab': lesfichestab,
        'fabricationtab': df.to_html()
    }
    return render(request, 'fabrications/fabricationpage.html', context)

注意:你的fabrication模型中type字段设置了允许为空,所以映射后需要用fillna('')处理空值,避免渲染表格时出现NaN。


内容的提问来源于stack exchange,提问作者Khaled.sahraoui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:54:19