如何解决用DJango和import_export导出数据,列重复 声明的字段匹配字段选项:具有不同名称的声明字段:
我正在创建一个 django 应用程序并且我正在使用 import_export 包。我已使用同时设置 attribute
和 column_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 举报,一经查实,本站将立刻删除。