用DJango和import_export导出数据,列重复 声明的字段匹配字段选项:具有不同名称的声明字段:

问题描述

我正在创建一个 django 应用程序并且我正在使用 import_export 包。我已使用同时设置 attributecolumn_name 的字段定义了我的资源。当我导出到 xlsx(或 csv)时,我得到带有 attribute 作为标题的列,以及带有 column_name 标题的重复列。

fields 子类中包含 Meta 属性不会影响此行为。

# app\resources.py

class RoleResource(resources.ModelResource):
    name = Field(attribute="name",column_name="Sales Role")
    role = Field(attribute="default_role" column_name="System Role")
    plan = Field(attribute="default_plan" column_name="System Plan")

    class Meta:
        model = Role
        # fields = ('name','default_role','default_plan') # commenting this doesn't change behavior

注释掉 Meta.fields 的最终输出有 6 列:销售角色、系统角色、系统计划、id、default_role、default_plan。

未注释 Meta.fields 的最终输出有 5 列:销售角色、系统角色、系统计划、default_role、default_plan。

我认为 column_name 是装饰性的。为什么我得到两个重复的列?

解决方法

为什么我得到两个重复的列?

因为您在 fields 元选项中混合了声明的属性和字段,并且它们具有不同的名称。

修复:重命名声明的字段以匹配所需的名称:

class RoleResource(resources.ModelResource):
    name = Field(attribute="name",column_name="Sales Role")
    default_role = Field(attribute="default_role" column_name="System Role")
    default_plan = Field(attribute="default_plan" column_name="System Plan")

    class Meta:
        model = Role
        fields = ('name','default_role','default_plan') 

所发生的事情是,当资源被实例化时,逻辑会查看哪些字段是 declared on the resource,并将它们添加到字段的本地字典中。然后它对声明的字段执行相同的操作。属性名称用作键,因此如果它们不同,则会出现重复项。

例如:

声明的字段匹配字段选项:

class BookResource(resources.ModelResource):
    # declared names match `fields`
    name = Field(attribute="name",column_name="Book Name")
    author_email = Field(attribute="author_email",column_name="Author Email")

    class Meta:
        model = Book
        fields = ('id','name','author_email')

输出:

Book Name |Author Email     |id
----------|-----------------|--
Foo       |email@example.com|1 

具有不同名称的声明字段:

class BookResource(resources.ModelResource):
    # declared fields are different
    some_other_name = Field(attribute="name",column_name="Book Name")
    some_other_author_email = Field(attribute="author_email",'author_email')

输出:

Book Name |Author Email     |id|name      |author_email     
----------|-----------------|--|----------|-----------------
Foo       |email@example.com|1 |Foo       |email@example.com

然后将 fields 声明用作白名单以确定哪些字段出现在输出中。如果您没有 fields 声明,则会显示所有字段。