Django 1.7: Makemigration: поле, не допускающее значение NULL

Я пытаюсь использовать 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: 

Я хотел бы знать, где я делаю это неправильно. Спасибо


person cgwid    schedule 18.01.2015    source источник
comment
Вы не делаете ничего плохого. У вас есть существующие строки в вашей таблице, и вы пытаетесь добавить поле, которое не имеет значения по умолчанию, но не может принимать значения NULL.   -  person Brandon    schedule 18.01.2015
comment
Это дает вам выбор, как решить эту проблему. Выберите вариант.   -  person Daniel Roseman    schedule 18.01.2015


Ответы (1)


Поскольку поле order уникально, вам нужно будет добавить это поле в несколько шагов миграции, заменив исходное operations в вашей миграции:

  • Добавьте поле, допускающее значение NULL, установите значение по умолчанию 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 в созданной миграции.

person knbk    schedule 18.01.2015