“Django AutoField”的错误迁移;id";领域

“Django AutoField”的错误迁移;id";领域,django,django-models,Django,Django Models,我有非常简单的Django模型: class MyModel(models.Model): user = models.ForeignKey(User) somestring = models.CharField( max_length=250 ) ... some other string fields... 模型中并没有声明的“id”字段,所以它有Django分配的自动主键 初始迁移如下所示: migrations.CreateModel(

我有非常简单的Django模型:

class MyModel(models.Model):
    user = models.ForeignKey(User)
    somestring = models.CharField(
        max_length=250
    )
   ... some other string fields...
模型中并没有声明的“id”字段,所以它有Django分配的自动主键

初始迁移如下所示:

migrations.CreateModel(
    name='MyModel',
    fields=[
         ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
         ('somestring', models.CharField(max_length=250))
         ... some other string fields...
    ],
    options={},
    bases=(models.Model,),
),
class Migration(migrations.Migration):

    dependencies = [
        ('foo', 'bar'),
    ]

    operations = [
        migrations.AddField(
            model_name='mymodel',
            name='id',                 <== !!!
            field=models.AutoField(auto_created=True, primary_key=True, default='', serialize=False, verbose_name='ID'),
            preserve_default=False,
        ),
    ]
它已成功应用,数据库表包含以下字段:

- id   <== autogenerated 
- user
- somestring
 etc...
运行manage.py makemigrations后,它生成了非常奇怪的迁移:

$ ./manage.py makemigrations
You are trying to add a non-nullable field 'id' to mymodel without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now()
>>> 
Please enter some code, or 'exit' (with no quotes) to exit.
>>> ''
Migrations for 'myapp':
  0036_auto_20150623_1535.py:
    - Add field id to mymodel
事情是这样的:

migrations.CreateModel(
    name='MyModel',
    fields=[
         ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
         ('somestring', models.CharField(max_length=250))
         ... some other string fields...
    ],
    options={},
    bases=(models.Model,),
),
class Migration(migrations.Migration):

    dependencies = [
        ('foo', 'bar'),
    ]

    operations = [
        migrations.AddField(
            model_name='mymodel',
            name='id',                 <== !!!
            field=models.AutoField(auto_created=True, primary_key=True, default='', serialize=False, verbose_name='ID'),
            preserve_default=False,
        ),
    ]
类迁移(migrations.Migration):
依赖项=[
(‘foo’、‘bar’),
]
操作=[
migrations.AddField(
model_name='mymodel',

name='id',好的,找到了一个可行的解决方法

在原始迁移中添加了“id”字段声明,因此不再报告它丢失

migrations.CreateModel(
    name='MyModel',
    fields=[
!!===>   ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
         ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
         ('somestring', models.CharField(max_length=250))
         ... some other string fields...
    ],
    options={},
    bases=(models.Model,),
),
此更改不会应用于我们已经进行了此迁移的环境,并且新环境从一开始就应该获得适当的db表结构

TIL:Django不使用SQL从DB中获取当前模型状态,-而是创建模型的mock,并将迁移应用于该mock,直到它根据所有可用的迁移操作获得最新版本的模型。然后将重建的模型与models.py中的真实模型进行比较


调整原始迁移解决了问题。感谢所有参与讨论的人。

表确实存在?您检查了表吗?表中有记录吗?表存在,它有记录我不确定,但迁移文件仅在数据库当前状态发生任何更改时创建。依我看这次迁移只有两个可能的原因。1.-django bug和2.-文件中的更改。如果您使用git,我建议您搜索文件中的更改。谢谢@MikeVelazco,我最近在这个文件中做了一些更改,但与“id”无关字段,因此不确定可能的原因。您的任何模型字段是否碰巧有
primary\u key=True
?看起来与此和此非常相似。