我正在将 MySQL 数据库从 php 应用程序集成到新的 Django 项目中。 Inspectdb效果很好,我只需要将几个字段更改为外键,现在所有读取和编辑当前数据的功能都运行良好。
问题是当我尝试创建新条目时,收到错误“字段 'id' 没有默认值”
。回溯从 form.save()
调用开始,异常来自 MySQL 游标。在大多数情况下,该列被命名为id
,但在一种情况下,它是一个命名值:
class ModelOne(models.Model): #normal "id" named pk
id = models.AutoField(primary_key=True, db_column='id', default=None)
other_fields = ...
class ModelTwo(models.Model): #specific pk
named_pk = models.AutoField(primary_key=True, db_column='named_pk',
default=None)
other_fields = ...
对于 ModelTwo,当我发布有效表单时,我收到错误,但如果我返回数据列表,新项目就会显示!在我检查 shell 中的最新 id
值后,我可以看到它们正在正确递增。
但是对于 ModelOne(只有 id
),错误仍然出现,并且 pk 变为 2147483647(最大值),并且由于重复的 id,后续保存失败。 (下一个最高pk只有62158)
我需要做什么才能使这些 id 字段正常工作?
<小时/>更新:仍然没有解决这个问题。考虑转储数据并将其导入到新的 Django 构建的表中。仍在寻找解决此问题的方法。
<小时/>更新2: 来自 db shell 的信息
模型一:
+-------------+--------------+-------+------+---------+-----------------+
| Field | Type | Null | Key | Default | Extra |
| id | int(11) | NO | PRI | NULL | auto_increment |
模型二:
+-------------+--------------+-------+------+---------+-----------------+
| Field | Type | Null | Key | Default | Extra |
| named_pk | int(11) | NO | PRI | NULL | auto_increment |
最佳答案
在经历了一些复杂的南方迁移之后,我遇到了同样的问题。 我们希望避免重新加载数据库(转储/导入),幸运的是,这将帮助其他在搜索相同问题后遇到这篇文章的人。
我们找到了解决这个问题的解决方案,无需导出和导入数据库。
对于名为 auth_user 的表,以下 MySQL 命令将修复上述错误消息:
ALTER TABLE auth_user MODIFY `id` INT(11) NOT NULL AUTO_INCREMENT;
原始解决方案来自:
http://webit.ca/2012/01/field-id-doesnt-have-a-default-value/
关于Django - 遗留数据库和 'id' 字段的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7491118/