【问题标题】:Django add new entry from admin panelDjango从管理面板添加新条目
【发布时间】:2014-08-03 18:01:05
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 这里没有足够的信息来诊断问题。如果您没有使用 200 条记录预先填充数据库,管理员工作正常,那么它可能与您执行此操作的方式有关。
  • 似乎是 db table 问题.. 你能检查一下数据吗.. 还要在这里粘贴模型
  • 好吧,如果我尝试从管理员创建一个新条目,而数据库中没有数据,它可以正常工作

标签: python django


【解决方案1】:

如果您使用 Django 创建了数据库表,那么当您在 Django 外部导入数据时,很可能您的 auto_increment 值没有更新。

也可能是当您导入数据时,您没有为 200 条记录分别赋予其唯一的主键。我认为(某些版本的)SQLite 有时会允许大量导入。

MySQL

例如,我在 Sequel Pro 中查看 MySQL 表,发现它的“auto_increment”值为 144。这意味着下一个主键值将是 144。

您可以使用以下方法查看您的表(在 MySQL 中)的此值:

SHOW TABLE STATUS FROM databaseName where name="entry"

将“databaseName”替换为 Django 数据库的名称。其他数据库软件可能会有不同的语法。

您可以使用以下方法设置下一个 auto_increment 值(在 MySQL 中):

ALTER TABLE databaseName.entry AUTO_INCREMENT ###

再次将 databaseName 替换为您的数据库名称;和以前一样,语法可能会因您使用的数据库软件而异。

如果这没有帮助,您可能会发现显示表格的状态并将其复制到您的问题中很有用。这也可能有助于追踪问题:

SHOW CREATE TABLE databaseName.entry

Postgres

在 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”是你的“entry”模型表中的列名;在您的表中可能会有所不同。请参阅http://www.postgresql.org/docs/8.1/static/functions-sequence.html 了解更多信息。

【讨论】:

  • 我忘了说我的数据库是postgresql
  • 是的,我应该从约束标题中猜到了。那么,在您的情况下, auto_increment 值是“序列”的一部分。
  • 好的,我会试试,稍后我会回复答案
最近更新 更多