“Django AutoField”的错误迁移;id";领域
我有非常简单的Django模型:“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(
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
?看起来与此和此非常相似。