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

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)

问题排查与修正

你的代码存在三个关键错误:

  1. Admin类属性名拼写错误:resources_class多了一个s,正确的属性名是resource_class,这直接导致你配置的reportResource没有被加载,导出时使用了默认行为显示ID。

  2. Admin继承顺序错误:reportAdmin应该先继承admin.ModelAdmin再继承ImportExportModelAdmin,Django的方法解析顺序会优先使用前面类的方法,顺序错误会导致导入导出的配置不生效。

  3. 模型类命名不规范(可选但建议修正):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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 20:34:56