Если у меня есть ненулевое поле модели, удалить его и создать миграцию, что миграция становится необратимой:Revert Джанго 1,7 RemoveField миграция
Рассмотрим следующую модель:
class Foo(models.Model):
bar = models.TextField()
test = models.TextField() # This field is to go away, bye-bye!
И миграция:
# app/migrations/003_remove_foo_test.py
class Migration(migrations.Migration):
dependencies = [
('app', '0002_foo_test'),
]
operations = [
migrations.RemoveField(
model_name='foo',
name='test',
),
]
Unapplying эту миграцию бросает исключение:
$ src/manage.py migrate app 0002
Operations to perform:
Target specific migration: 0002_foo_test, from app
Running migrations:
Unapplying app.0003_remove_foo_test...Traceback (most recent call last):
...
django.db.utils.IntegrityError: column "test" contains null values
Конечно, это ожидаемое поведение, это clearly documented и я не спрашиваю, почему это происходит:
Имейте в виду, что при обратном это на самом деле добавления поля к модели; если поле не является нулевым, это может привести к необратимой операции (кроме потери данных, которая, конечно же, является необратимой).
Однако, все мы делаем ошибки, и иногда мы просто нужно, чтобы каким-то образом отменить удаление поля, даже если это означает вручную предоставление специального значения заглушки для всех отмененных непустых полей. Например, южные миграции необязательно позволяют отменить такие операции (попросив разработчика указать, следует ли предоставлять по умолчанию восстановленные поля или запретить обратную миграцию), что, похоже, не относится к всем новым причудливым переходам Django 1.7 ,
Вопрос: что является самым простым и быстрым способом отменить удаление поля с помощью переноса Django 1.7+ (предположим, что это уже произошло)? Это не обязательно должно быть полностью написано с помощью Python, это сделает набор ручных инструкций.
'AlterField' не принимает аргумент' preserve_default' (но в этом случае он, похоже, не нужен, так как 'default' никак не попадает в схему базы данных). Помимо этого, это, по-видимому, правильное и оптимальное решение. Благодаря! –
Согласно [документации] (https://docs.djangoproject.com/en/1.7/ref/migration-operations/#django.db.migrations.operations.AlterField), да, но это было добавлено в 1.7. 1. И в этом случае preserve_default не имеет значения. Он действительно попадает в базу данных, но только на короткое время. – GwynBleidD
Это не работает в Django 1.8 – jess