微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决用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 声明,则会显示所有字段。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。