使用 django-import-export 导出并显示相关对象的详细名称
Posted
技术标签:
【中文标题】使用 django-import-export 导出并显示相关对象的详细名称【英文标题】:Exporting using django-import-export and showing verbose names of related objects 【发布时间】:2019-02-16 02:48:39 【问题描述】:我正在查看以下库 - django-import-export。 但是,我在导出相关对象的友好/详细列名时遇到问题。
相关链接:https://github.com/django-import-export/django-import-export/issues/52
class HumanModelResource(resources.ModelResource):
def get_export_headers(self):
headers = []
for field in self.get_fields():
model_fields = self.Meta.model._meta.get_fields()
header = next((x.verbose_name for x in model_fields if x.name == field.column_name), field.column_name)
headers.append(header)
return headers
class Meta:
model = Human
fields = ("name", "pet__name")
class HumanAdmin(ExportMixin, admin.ModelAdmin):
resource_class = HumanModelResource
list_display = ("name", "pet")
class Human(models.Model):
name = models.CharField(max_length=255, verbose_name="Name")
pet = models.ForeignKey(Pet)
class Pet(models.Model):
name = models.CharField(max_length=255, verbose_name="Pet Name")
导出将显示人类的“名称”,但宠物名称将显示为“pet__name”。
我不确定如何重写 get_export_headers 方法以显示相关对象的详细名称。
我目前正在使用: - Python 2.7 - Django 1.11
【问题讨论】:
【参考方案1】:我猜你的 get_export_headers()
失败是因为 x.name == field.column_name
匹配失败(x.name
= pet
和 field.column_name
= pet__name
)。
因此,您可以修复该特定错误,但还有另一种更符合 Django Import/Export 的 API 的方法:显式定义外键关系。
from import-export import resources, fields
class HumanModelResource(resources.ModelResource):
petname = fields.Field(
attribute="pet",
column_name="Pet Name",
widget=ForeignKeyWidget(Pet, "name")
)
class Meta:
model = Human
fields = ("name", "petname") # note the change
(注:未经测试。)
【讨论】:
无需小部件即可为我工作。谢谢以上是关于使用 django-import-export 导出并显示相关对象的详细名称的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 django-import-export 为字段定义管理员导入格式
如何在 django-import-export 中使用 ForeignKeywidget 解决 MultipleObjectsReturned