Django Import-Export Import Duplicate key value violates 错误

Django Import-Export Import Duplicate key value violates Error

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

Line number: 1961 - duplicate key value violates unique constraint "article_article_pkey" DETAIL: Key (id)=(1961) already exists.

即使我在 Django 管理中看到我的文章模型,它也会显示 1-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',)

我已经触发了问题是什么: 实际上,问题是 PostgreSQL 主键顺序未与 table 行同步。 这就是为什么当我插入新行时出现重复键错误,因为串行数据类型中隐含的序列 returns 已经存在的数字。

为了解决这个问题,我们必须为 PostgreSQL 重置 ID 顺序, 这是分步指南:

  1. 登录数据库 shell 并连接到您的数据库
  2. 首先,检查 table 的 id 列的最大值为 SELECT MAX(id) FROM your_table;
  3. 然后,检查 ID 的下一个值是什么:SELECT nextval('your_table_id_seq');
  4. 如果nextval是下一个Max值的数字就对了。 例如 MAX=10 & nextval=11
  5. 否则将 table 的 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;

我遇到了这个问题,因为我指定了自定义 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

我经常 运行 for 循环。这也会更新我的自动日期时间字段:

import Article
for i in range(1, your_last_id + 1):
    item = Article.objects.get(id=i)
    item.save()

your_last_id 可能是 SELECT MAX(id)