Django Import-Export导入重复键值违反了Error

时间:2017-10-19 06:39:24

标签: python django postgresql django-models django-import-export

我正在使用Django 1.10,Python 3.6和PostgreSQL作为数据库后端的项目,其中我有一个名为'Article'的模型,我需要从CSV文件导入数据。我导入了我的第一个CSV文件成功完成以下字段: id,link&类别 它的ID字段从1到1960开始 然后在下一个文件中,我从1961年开始向ID字段开始,但它显示以下错误:

  

行号:1961 - 重复键值违反唯一约束“article_article_pkey”DETAIL:Key(id)=(1961)已存在。

即使我在Django管理员中看到我的文章模型,它也显示了从1960年开始的ID

这是我的models.py:

class Article(models.Model):
   id = models.AutoField(primary_key=True)
   link = models.URLField(max_length=255)
   category = models.CharField(max_length=255, choices=Categories)

这是admin.py

@admin.register(Article)
    class ArticleAdmin(ImportExportModelAdmin):
    resource_class = views.ArticleResource
    readonly_fields = ('id',)

2 个答案:

答案 0 :(得分:0)

我已经触发了问题: 实际上,问题是PostgreSQL主键顺序,它不与表行同步。 这就是为什么当我插入一个新行时,我得到一个重复的键错误,因为串行数据类型中隐含的序列返回一个已经存在的数字。

要解决此问题,我们必须重置PostgreSQL的ID顺序, 这是一步一步的指南:

  1. 登录数据库外壳并连接到数据库
  2. 首先,检查表格的id列的最大值为SELECT MAX(id) FROM your_table;
  3. 然后,检查ID的下一个值是什么:SELECT nextval('your_table_id_seq');
  4. 如果nextval是下一个Max值,那么它是正确的。 例如MAX = 10& NEXTVAL = 11
  5. 否则,请将表的id_seq重置为:

    BEGIN;

    - 在更新计数器时防止并发插入

    LOCK TABLE your_table IN EXCLUSIVE MODE;

    - 更新序列

    SELECT setval('your_table_id_seq', COALESCE((SELECT MAX(id)+1 FROM your_table), 1), false);

    COMMIT;

答案 1 :(得分:0)

我遇到了这个问题,因为我指定了一个自定义import_id_fields字段,但没有排除id字段。

我已指定:

    import_id_fields = ('code',)
    skip_unchanged = True
    report_skipped = True

但是我需要:

    import_id_fields = ('code',)
    skip_unchanged = True
    report_skipped = True
    exclude = ('id',)

有点菜鸟错误,但这可能为某人节省了一个Google。

参考:https://github.com/django-import-export/django-import-export/issues/273