4

我正在使用Django 1.10,Python 3.6和PostgreSQL作为数据库后端,其中我有一个名为“Article”的模型,我需要从中导入数据CSV文件我已经成功导入了我的第一个CSV文件,其中包含以下字段: ID,链接&类别 它的ID字段从1开始到1960 然后在下一个文件中,我已经从1961年开始ID字段,但它显示以下错误:Django导入导出导入重复键值违反错误

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

,甚至当我看到在Django我的文章模型管理它显示了从1960年1标识

这里是我的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',) 
+0

你能告诉你的资源类呢? –

+0

你的意思是? –

+0

ArticleResource –

回答

0

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

为了解决这个问题,我们必须重新对PostgreSQL的ID顺序, 这里是一步一步的指导:

  1. 登录到DB外壳和连接到数据库
  2. 首先,检查最大值为您的表的ID列SELECT MAX(id) FROM your_table;
  3. 然后,检查了什么事情是ID为下一个值:SELECT nextval('your_table_id_seq');
  4. 如果NEXTVAL为最大值的下一个号码,然后它是正确的。 如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;