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
相关产品推荐
相关产品推荐

