Django Import-Export导出Excel外键仅显示ID不显示名称问题
Django Import-Export 外键导出仅显示ID问题修复
问题现象
使用Django Import-Export导出Excel文件时,外键字段仅输出ID值,未展示关联模型对应的名称字段,异常效果参考:截图说明
已参考官方API widgets文档、相关技术方案调整代码,涉及项目代码如下:
models.py
from pyexpat import model from statistics import mode from django.db import models from django.contrib.auth.models import User from django.db.models.base import Model from django.forms import IntegerField class Post(models.Model): name = models.CharField(max_length=150) def __str__(self): return str(self.name) class Person(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE) name = models.CharField(max_length=100) def __str__(self): return f"({self.name} is {self.post} " class Room(models.Model): name = models.CharField(max_length= 150 ) def __str__(self): return str(self.name) class Classification(models.Model): name = models.ForeignKey(Person, on_delete=models.CASCADE) room = models.ForeignKey(Room, on_delete=models.CASCADE) date = models.DateField(auto_created=False) def __str__(self): return f"({self.name} Take {self.room} at {self.date})"
admin.py(原问题代码)
from django.contrib import admin from import_export.admin import ImportExportModelAdmin from .models import * from import_export import fields, resources from import_export.widgets import ForeignKeyWidget @admin.register(Post, Room, Classification, Person) class TestappImportExport(ImportExportModelAdmin): pass class Classificationresource(resources.ModelResource): name = fields.Field( column_name='name', attribute='name', widget=ForeignKeyWidget(Person, 'name')) room = fields.Field( column_name = 'room', attribute = 'room', widget= ForeignKeyWidget(Room, 'name')) class Meta: fields = ('name', 'room')
故障原因
- 核心原因:自定义的
Classificationresource未绑定到Classification对应的Admin配置。当前代码用通用Admin类批量注册所有模型,未指定resource_class参数,框架会自动生成默认Resource类执行导出,完全没有用到自定义的外键字段渲染配置,因此输出外键原始ID。 - 次要配置缺失:自定义Resource类的
Meta内部类未指定model属性绑定对应模型,属于不规范写法。 - 代码存在冗余导入、类名不符合大驼峰规范等小问题,不影响运行但可优化。
修复方案
- 将需要自定义导出逻辑的
Classification模型从批量注册列表中拆分,单独配置Admin类,指定resource_class为自定义的资源类 - 补全Resource类的
model配置,规范类名写法
修复后的admin.py代码如下:
from django.contrib import admin from import_export.admin import ImportExportModelAdmin from .models import Post, Room, Classification, Person from import_export import fields, resources from import_export.widgets import ForeignKeyWidget # 自定义Classification模型的导出资源类 class ClassificationResource(resources.ModelResource): name = fields.Field( column_name='name', attribute='name', widget=ForeignKeyWidget(Person, 'name') ) room = fields.Field( column_name='room', attribute='room', widget=ForeignKeyWidget(Room, 'name') ) class Meta: model = Classification # 可按需添加date等其他需要导出的字段 fields = ('name', 'room', 'date') # 无自定义导出逻辑的模型保持通用注册即可 @admin.register(Post, Room, Person) class BasicImportExport(ImportExportModelAdmin): pass # Classification模型单独注册,绑定自定义资源类 @admin.register(Classification) class ClassificationAdmin(ImportExportModelAdmin): resource_class = ClassificationResource
扩展说明
如果需要导出多层嵌套的外键字段(比如导出Person关联的Post名称),直接通过双下划线跨关系定义字段即可,示例:
class ClassificationResource(resources.ModelResource): name = fields.Field( column_name='person_name', attribute='name', widget=ForeignKeyWidget(Person, 'name') ) # 跨Classification -> Person -> Post 关系导出岗位名称 post = fields.Field( column_name='post_name', attribute='name__post', widget=ForeignKeyWidget(Post, 'name') ) room = fields.Field( column_name='room', attribute='room', widget=ForeignKeyWidget(Room, 'name') ) class Meta: model = Classification fields = ('name', 'post', 'room', 'date')
注意:用作ForeignKeyWidget匹配依据的字段(比如Person.name、Room.name)需要保证值唯一,否则导出/导入时会出现匹配错误。
内容的提问来源于stack exchange,提问作者Khaled.sahraoui
相关产品推荐
相关产品推荐

