Jeśli mam pole modelu non-zerowalne, należy go usunąć i utworzyć migrację, że migracja staje się nieodwracalne:Przywróć Django 1.7 RemoveField migracja
Rozważmy następujący model:
class Foo(models.Model):
bar = models.TextField()
test = models.TextField() # This field is to go away, bye-bye!
I Migracja:
# 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 tego przechodzenia wyjątek to
$ 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
Oczywiście, jest to oczekiwane zachowanie, to clearly documented i nie pytam, dlaczego tak się dzieje:
pamiętać, że po odwróceniu jest to faktycznie dodanie pola do modelu; jeśli pole nie jest zerowane, może to spowodować nieodwracalną operację (z wyjątkiem utraty danych, która oczywiście jest nieodwracalna).
Jednak wszyscy popełniają błędy, a czasami po prostu trzebado jakoś odwrócić usunięcie terenie, nawet jeśli oznacza to ręcznie zapewniając wartość skrótową ad hoc na wszystkich polach odwróconych non-null. Na przykład migracje na południu opcjonalnie umożliwiają odwrócenie takich operacji (poprzez zapytanie dewelopera o ustawienie domyślne dla przywróconych pól lub uniemożliwienie migracji zwrotnej), co nie wydaje się mieć miejsca w przypadku wszystkich nowych wymyślnych migracji Django 1.7 .
Pytanie: jaki jest najłatwiejszy/najszybszy sposób na cofnięcie usunięcia pola przy użyciu migracji Django 1.7+ (zakładając, że już się stało)? To niekoniecznie musi być w pełni skryptowane w Pythonie, zrobi to zestaw instrukcji manualnych.
'AlterField' nie akceptuje argumentu' preserve_default' (ale nie wydaje się być w tym przypadku potrzebny, ponieważ 'default' i tak nie przechodzi do schematu bazy danych). Poza tym wydaje się to być właściwym i optymalnym rozwiązaniem. Dzięki! –
Zgodnie z [dokumentacją] (https://docs.djangoproject.com/en/1.7/ref/migration-operations/#django.db.migrations.operations.AlterField), tak, ale zostało dodane w 1.7. 1. W takim przypadku preserve_default nie powinno mieć znaczenia. Dostaje się do bazy danych, ale tylko na krótką chwilę. – GwynBleidD
To nie działa w Django 1.8 – jess