django - 多次导入同一文件时Django导入导出重复行
问题描述
我正在构建一个工具,允许用户上传 CSV 文件以使用该django-import-export
工具更新数据库。我上传了包含一个数据行的测试 CSV 文件,然后再次上传并得到了一个重复的行(具有新的主键,但所有其他值都相同)。该row.import_type
值是“更新的”,但唯一更新的是 id。
然后我第三次上传相同的文件并收到错误:
app.models.Role.MultipleObjectsReturned: get() returned more than one Role -- it returned 2!
(顺便说一句,我真的很感谢那个错误消息中的感叹号。)
理想情况下,我会在文件的第二次导入和第三次导入时跳过一行。我想我会接受一个错误。该文件的内容是:
Sales Role,System Role,System Plan,id
Sales Rep,Account Executive,951M-NA,
这是用户在导出 csv 数据集时获得的格式。理想情况下,他们会导出一个文件,更改几列(除了 import_id_field 的名称),然后重新上传数据。
在 app/resources.py 中:
class RoleResourec(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:
models=Role
fields= ('id', 'name', 'default_role', 'default_plan')
import_id_fields = ('name',)
skip_unchanged = True
据我所知,在第二次导入时,该get_or_init_instance()
方法没有从第一次导入中找到对象,但在第三次导入时确实找到了它们。我没有对资源做任何事情来自定义导入数据工作流页面中描述的导入工作流。
这里出了什么问题?我是否需要自定义导入工作流程,还是我错过了资源中的另一个必需属性?
解决方案
如果所有声明的字段在导入的行和持久对象中都相同,则逻辑只会跳过该行。如果任何字段不同,则将执行更新。
为此,您声明的字段import_id_fields
必须是一行的唯一匹配项,否则您将获得MultipleObjectsReturned
.
在您的情况下,如果正在创建重复的行,那么它必须意味着name
第二次运行时数据库中不存在该行。我假设您没有覆盖ModelInstanceLoader
或以批量模式运行,因为这会破坏跳行逻辑。
默认情况下,import_id_fields
设置为行 ID,因此如果您可以将其包含在导出中,那么您可以保证拥有唯一的行。显然用户不应该改变这个字段,否则你会得到重复。
MultipleObjectsReturned
错误来自这里,它只是对Role.objects.get(name=<n>)
.
推荐阅读
- typescript - 通常调用 () => void 类型的函数是什么?
- excel - IF + AND + 日期范围公式
- apache-kafka - 使用基于 kafka 的排序的 Hyperledger Fabric 1.4 设置 Hyperledger Caliper
- javascript - 通过 IPC 发送时“对象已被破坏”
- css - 具有后代选择器特异性的通用选择器
- php - Sethandler fcgi 代理在 Ubuntu 14.04/Apache 2.4.7 php7.2-fpm 上不起作用
- java - 使用 Java Streaming API 从 list.forEach 返回一个列表
- c# - 兑换
在 web api 中建模类类型 - mysql - 将7天添加到时间戳日期mysql
- javascript - 画布javascript动画-从左到右运行的矩形改变颜色-动画重复问题