Django AutoField默认值错误

WAF*_*WAF 5 mysql django database-migration python-2.7

Django 1.7.1,MySQL 5.6,Python 2.7.8

我有一个看起来像这样的模型:

class Host(models.Model):
    hostName = models.CharField(max_length=45, primary_key=True)
    ...
Run Code Online (Sandbox Code Playgroud)

primary_key=True手动删除,这导致manage.py sqlmigrate显示主键被删除,'id'正在添加自动增量列,并且它正在获取主键.我被提示输入新'id'列的默认值,并错误地给它1,这已经在表中.相关的SQL读取:

ALTER TABLE `Host` ADD COLUMN `id` integer AUTO_INCREMENT DEFAULT 1 NOT NULL PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)

和迁移代码包括:

    operations = [
    migrations.AddField(
        model_name='host',
        name='id',
        field=models.AutoField(auto_created=True, primary_key=True, default=1, serialize=False, verbose_name='ID'),
        preserve_default=False,
    ),
Run Code Online (Sandbox Code Playgroud)

结果是我仍然可以修改我的模型和makemigrations工作,但每个migrate命令都会出现此错误:

django.db.utils.OperationalError: (1067, "Invalid default value for 'id'")
Run Code Online (Sandbox Code Playgroud)

并且不生效.

我已经尝试恢复主键更改,在上一次迁移时手动指向紧接的后续迁移(这会引发一致性问题),并明确迁移到上一次迁移.我真正想做的只是擦除/忽略问题迁移.我也很满意抑制错误,因为我已经恢复了改变.我该怎么办?

编辑: 另外,如果自动增量列永远不能有默认值,为什么Django允许自己传递SQL ...AUTO_INCREMENT DEFAULT 1...

小智 6

您可以修复SQL中的错误(如果您还没有),然后运行 ./manage.py migrate [your_app_name] [the_migration_number] --fake

--fake将告诉Django假装它运行迁移,它不会再尝试运行它.

请确保您在SQL中所做的更改准确地反映在虚假迁移中,因为Django在您运行时不会将模型与数据库进行比较makemigrations.

关于id列的错误,如果我没记错的话,你不能为mysql自动增量字段分配一个默认值.