【发布时间】:2016-04-17 01:56:51
【问题描述】:
更新
我已提交feature request。思路是当unique或unique_together拒绝数据库中已经存在的记录时,数据库产生的IntegrittyError上的pass。
我有以下型号:
class Compositions(models.Model):
composer_key = models.ForeignKey(
Composer,
)
composition = models.CharField(
max_length=383,
)
class Meta(object):
unique_together = (('composer_key', 'composition'), )
在管理界面中使用 django-import-export,不为 csv 文件中的每个条目提供id,...如果一对 csv 文件已经存在,则程序将因完整性错误而中断
duplicate key value violates unique constraint "data_compositions_composer_key_id_12f91ce7dbac16bf_uniq"
DETAIL: Key (composer_key_id, composition)=(2, Star Wars) already exists.
CSV 文件如下:
id composer_key composition
1 Hot Stuff
2 Star Wars
The idea 是使用skip_row 并在管理员中实现它。
admin.py:
class CompositionsResource(resources.ModelResource):
class Meta:
model = Compositions
skip_unchanged = True
report_skipped = True
class CompositionsAdmin(ImportExportModelAdmin):
resource_class = CompositionsResource
admin.site.register(Compositions, CompositionsAdmin)
然而,这并不能解决问题,因为skip_row 期望 csv 文件中有一个 id,以便检查每一行是否与非常特定的数据库条目相同。
考虑到在使用unique(_together) 时可以由数据库执行此控制,捕获此错误然后在此错误上返回skip_row = True 或pass 不是有效吗?
【问题讨论】:
-
default implementation 看起来很实用,应该可以开箱即用。你能展示你的CSV吗?也许,
pk属性有什么不同? -
@AlexMorozov 我已经用相关的 csv 数据更新了我的答案。我想知道删除
unique_together是否会产生任何影响,因为实现是正确的。我下班后试试看。 -
您的
id列是空的吗?如果是这样,在检查重复项时,模块可能会自欺欺人,因为新对象的 pk 与数据库中的 pk 不同。所以它尝试添加另一条记录,是的,由于unique_together约束而失败。我建议您不要删除约束,但首先尝试为您的 csv 记录分配一个永久的ids。不管怎样,让我知道进展如何) -
@Paolo 实际上,我确实编写了一个脚本来完成这项工作。我把它贴在下面,虽然它是“即时”写的。
-
@Paolo 查看有关此问题的最新答案,非常酷!
标签: python django django-import-export