Skip to main content
 首页 » 编程设计

python之使用 django-import-export 导出并显示相关对象的详细名称

2024年12月31日26wuhuacong

我正在查看以下库 - 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

请您参考如下方法:

我猜你的 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 

(注意:未经测试。)