django-import-export中ForeignKeyWidget导出显示ID问题求助
Django-import-export ForeignKeyWidget 导出显示ID而非名称的问题
我在使用django-import-export的ForeignKeyWidget时遇到问题:导出report数据时,关联的asset字段显示ID而非名称,已经按照官方文档示例配置了models和admin.py代码,但问题仍未解决,请求指出代码错误。
模型代码
from django.db import models from datetime import datetime class asset(models.Model): name = models.CharField(max_length=8) def __str__(self): return f"{self.id} {self.name}" class report(models.Model): machine = models.ForeignKey(asset, on_delete=models.CASCADE) last_active = models.DateField() return_code = models.CharField(max_length=16, blank=True) comment = models.CharField(max_length=256, blank=True) status = models.CharField(max_length=256, blank=True) @property def since(self): return (datetime.now().date() - self.last_active).days def __str__(self): return f"{self.machine} {self.last_active} {self.return_code} {self.comment} {self.status}"
admin.py代码
from django.contrib import admin from django.contrib.admin import DateFieldListFilter from import_export.admin import ImportExportModelAdmin from import_export import fields, resources from import_export.widgets import ForeignKeyWidget from .models import asset, report class reportResource(resources.ModelResource): machine = fields.Field( column_name='machine', attribute='machine', widget=ForeignKeyWidget(asset, 'name')) class Meta: model = report # fields = ('machine',) class reportAdmin(ImportExportModelAdmin, admin.ModelAdmin): list_display = ("machine", "last_active", "return_code", "comment", "status") resources_class = reportResource admin.site.register(report, reportAdmin) admin.site.register(asset)
问题排查与修正
你的代码存在三个关键错误:
Admin类属性名拼写错误:
resources_class多了一个s,正确的属性名是resource_class,这直接导致你配置的reportResource没有被加载,导出时使用了默认行为显示ID。Admin继承顺序错误:
reportAdmin应该先继承admin.ModelAdmin再继承ImportExportModelAdmin,Django的方法解析顺序会优先使用前面类的方法,顺序错误会导致导入导出的配置不生效。模型类命名不规范(可选但建议修正):Django模型类应使用大驼峰命名(如
Asset而非asset),虽然不是直接原因,但规范命名能避免潜在的隐式错误。
修正后的代码
models.py
from django.db import models from datetime import datetime class Asset(models.Model): name = models.CharField(max_length=8) def __str__(self): return f"{self.id} {self.name}" class Report(models.Model): machine = models.ForeignKey(Asset, on_delete=models.CASCADE) last_active = models.DateField() return_code = models.CharField(max_length=16, blank=True) comment = models.CharField(max_length=256, blank=True) status = models.CharField(max_length=256, blank=True) @property def since(self): return (datetime.now().date() - self.last_active).days def __str__(self): return f"{self.machine} {self.last_active} {self.return_code} {self.comment} {self.status}"
admin.py
from django.contrib import admin from django.contrib.admin import DateFieldListFilter from import_export.admin import ImportExportModelAdmin from import_export import fields, resources from import_export.widgets import ForeignKeyWidget from .models import Asset, Report class ReportResource(resources.ModelResource): machine = fields.Field( column_name='machine', attribute='machine', widget=ForeignKeyWidget(Asset, 'name')) class Meta: model = Report fields = ('machine', 'last_active', 'return_code', 'comment', 'status') # 显式指定导出字段,避免默认冲突 class ReportAdmin(admin.ModelAdmin, ImportExportModelAdmin): list_display = ("machine", "last_active", "return_code", "comment", "status") resource_class = ReportResource # 修正属性名拼写 admin.site.register(Report, ReportAdmin) admin.site.register(Asset)
内容的提问来源于stack exchange,提问作者Kripke
相关产品推荐
相关产品推荐

