【问题标题】:Django 1.7: Makemigration: non-nullable fieldDjango 1.7:Makemigration:不可为空的字段
【发布时间】:2015-03-16 17:35:42
【问题描述】:

我正在尝试在我的项目中使用 django-orderedmodel (https://github.com/kirelagin/django-orderedmodel)。

运行 makemigrations 不起作用:

 You are trying to add a non-nullable field 'order' to slide 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: 

我想知道我做错了什么。谢谢

【问题讨论】:

  • 你没有做错什么。您的表中有现有行,并且您正在尝试添加一个没有默认值但不能为空的字段。
  • 它让您选择如何解决它。选择一个选项。

标签: python django database field non-nullable


【解决方案1】:

由于order 字段是唯一的,您需要在几个迁移步骤中添加该字段,替换迁移中的原始operations:

  • 添加一个可以为空的字段,设置默认为NULL。
  • 将字段设置为每行中的唯一值。
  • 添加NOT NULL 约束。

即像这样:

operations = [
    migrations.AddField('myapp.MyModel', 'order', models.PositiveIntegerField(null=True, unique=True)),
    migrations.RunPython(set_order),
    migrations.AlterField('myapp.MyModel', 'order', models.PositiveIntegerField(blank=True, unique=True)),
]

其中set_order 是将order 设置为有效值的函数,例如:

def set_order(apps, schema_editor):
    MyModel = apps.get_model('myapp', 'MyModel')
    for i, model in enumerate(MyModel.objects.all()):
        model.order = i
        model.save()

提供一个默认值(即0)最简单,然后在生成的迁移中替换operations。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 2016-05-22
    • 2016-08-09
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多