Django - 遗留数据库和'id'字段的问题

时间:2011-09-20 20:03:31

标签: django django-models django-database

我正在将一个来自php应用程序的MySQL数据库集成到一个新的Django项目中。 Inspectdb效果很好,我只需要将几个字段更改为ForeignKeys,现在所有的读取和编辑当前数据都运行良好。

问题是当我尝试创建新条目时,出现错误 "Field 'id' doesn't have a default value" 。回溯从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表中。仍在寻找这个问题的解决方案。


UPDATE2: 来自db shell的信息

ModelOne:

+-------------+--------------+-------+------+---------+-----------------+
| Field       | Type         | Null  | Key  | Default | Extra           |
| id          | int(11)      | NO    | PRI  | NULL    | auto_increment  |

ModelTwo:

+-------------+--------------+-------+------+---------+-----------------+
| Field       | Type         | Null  | Key  | Default | Extra           |
| named_pk    | int(11)      | NO    | PRI  | NULL    | auto_increment  |

3 个答案:

答案 0 :(得分:5)

在一些复杂的南迁移之后,我遇到了同样的问题。 我们希望避免重新加载数据库(转储/导入),幸运的是,它会帮助其他人在搜索同一问题后落在这个帖子上。

我们找到了解决此问题的解决方案,无需导出和导入数据库。

对于名为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/

答案 1 :(得分:3)

为ModelTwo定义pk是有意义的(因为你已经在做),因为你的pk有不同的名字'named_pk'。但是,无需将'id'明确定义为ModelOne的pk。 Django默认会创建id列。因此,不要为ModelOne定义id列。

更新:从模型中删除“default = None”,并为ModelTwo for named_pk

从数据库中删除默认值NULL

答案 2 :(得分:1)

我最终导出了原始数据库中的数据,并将其加载到由我的模型/项目生成的新数据库中。

我认为我在使用原始数据库的副本时尝试了太多东西,并为pk字段搞砸了底层SQL。

我很高兴我只是在处理副本。