我正在使用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',)
答案 0 :(得分:0)
我已经触发了问题: 实际上,问题是PostgreSQL主键顺序,它不与表行同步。 这就是为什么当我插入一个新行时,我得到一个重复的键错误,因为串行数据类型中隐含的序列返回一个已经存在的数字。
要解决此问题,我们必须重置PostgreSQL的ID顺序, 这是一步一步的指南:
SELECT MAX(id) FROM your_table;
SELECT nextval('your_table_id_seq');
否则,请将表的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