我尝试使用Django中的管理面板添加新条目 问题是我已经用200条记录填充了我的数据库,如果我尝试从管理员添加新条目,我会得到一个重复的密钥错误消息,每当我再次尝试该过程时它会不断增加 错误:
duplicate key value violates unique constraint "app_entry_pkey"
admin.py:
admin.site.register(Entry)
模型:
class Entry(models.Model):
title = models.CharField(max_length=255)
url = models.TextField(max_length=255)
img = models.CharField(max_length=255)
def __unicode__(self):
return self.title
答案 0 :(得分:1)
如果您使用Django创建了数据库表,那么当您在Django之外导入数据时,很可能没有更新您的auto_increment值。
也可能是当您导入数据时,您没有给出200条记录,每条记录都有自己唯一的主键。我认为(某些版本的)SQLite有时会允许大规模导入。
例如,我正在查看Sequel Pro中的MySQL表,并看到它的“auto_increment”值为144.这意味着下一个主键值将为144.
您可以使用以下命令查看表中的值(在MySQL中):
SHOW TABLE STATUS FROM databaseName where name="entry"
用Django数据库的名称替换“databaseName”。其他数据库软件可能会有不同的语法。
您可以使用以下方法设置下一个auto_increment值(在MySQL中):
ALTER TABLE databaseName.entry AUTO_INCREMENT ###
再次将databaseName替换为您的数据库名称;和以前一样,语法可能会因您使用的数据库软件而异。
如果这没有帮助,您可能会发现显示表的状态并将其复制到您的问题中很有用。这可能也有助于追踪问题:
SHOW CREATE TABLE databaseName.entry
在Postgres中,您可以使用以下内容获取自动增量变量的当前值(在Postgres中称为序列):
SELECT last_value FROM app_entry_pkey;
您可能会将其设置为新值,例如:
ALTER SEQUENCE app_entry_pkey RESTART WITH ###
或
SELECT setval('app_entry_pkey', ###)
但请注意,我没有Postgres数据库方便测试这些。您还可以找到以下命令:
SELECT MAX(id) FROM entry
SELECT nextval('app_entry_pkey')
后者通常应大于前者,并注意“id”是“条目”模型表中列的名称;你的桌子可能会有所不同。有关详细信息,请参阅http://www.postgresql.org/docs/8.1/static/functions-sequence.html。