5

我正在将一个 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,当我发布一个有效的表单时,我得到了错误,但是如果我回到我的数据列表,新的项目就会出现!在我检查了idshell 中的最新值之后,我可以看到它们正在正确递增。

但是对于 ModelOne(只有id),错误仍然出现,并且 pk 变为 2147483647(最大值)并且由于重复的 id,后续保存失败。(下一个最高的pk只有62158)

我需要做什么才能使这些 id 字段正常工作?


更新:解决这个问题仍然没有运气。考虑转储数据并将其导入到新的 Django 构建的表中。仍在寻找解决此问题的方法。


update2:来自 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  |
4

3 回答 3

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/

于 2012-08-20T11:46:05.080 回答
3

为 ModelTwo 定义 pk 是有意义的(正如您已经在做的那样),因为您的 pk 具有不同的名称“named_pk”。但是,无需将“id”明确定义为 ModelOne 的 pk。Django 默认会创建 id 列。所以根本不要为 ModelOne 定义 id 列。

更新:从模型中删除“default=None”,并从数据库中删除 ModelTwo 的默认 NULL,用于 named_pk

于 2011-09-21T21:09:16.727 回答
1

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

我想我已经用我正在处理的原始数据库的副本尝试了太多东西,并且搞砸了 pk 字段的底层 SQL。

我很高兴我只使用副本。

于 2011-09-29T19:36:42.430 回答