gpt4 book ai didi

python - Django 导入-导出 : IntegrittyError when trying to insert duplicate record in field(s) with unique or unique_together constraints

转载 作者:太空宇宙 更新时间:2023-11-03 13:39:06 26 4
gpt4 key购买 nike

更新

我已经提交了 feature request .这个想法是在 uniqueunique_together 拒绝已存在的记录时,传递 由数据库产生的 IntegrittyError在数据库中。


我有以下模型:

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 并在管理员中实现它。

管理员.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 这个错误?

最佳答案

只需要一个更改。你可以使用 django-import-export

模型.py

    class Compositions(models.Model):
composer_key = models.ForeignKey(
Composer,
)
composition = models.CharField(
max_length=383,
unique=False
)
date_created = models.DateTimeField(default=timezone.now)

class Meta(object):
unique_together = (('composer_key','composition'),)

用 try 覆盖 save_instance。并在失败时忽略错误。admin.py

        class CompositionsResource(resources.ModelResource):

class Meta:
model = Compositions
skip_unchanged = True
report_skipped = True

def save_instance(self, instance, using_transactions=True, dry_run=False):
try:
super(CompositionsResource, self).save_instance(instance, using_transactions, dry_run)
except IntegrityError:
pass

class CompositionsAdmin(ImportExportModelAdmin):
resource_class = CompositionsResource

admin.site.register(Compositions, CompositionsAdmin)

并导入这个

from django.db import IntegrityError

关于python - Django 导入-导出 : IntegrittyError when trying to insert duplicate record in field(s) with unique or unique_together constraints,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34743883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com