Se ho un campo Modello non annullabile, rimuoverlo, e creare una migrazione, che la migrazione diventa irreversibile:Revert Django 1.7 RemoveField migrazione
Si consideri il seguente modello:
class Foo(models.Model):
bar = models.TextField()
test = models.TextField() # This field is to go away, bye-bye!
E migrazione:
# 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 questa migrazione genera un'eccezione:
$ 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
Naturalmente, questo è il comportamento previsto, è clearly documented e non sto chiedendo perché questo accade:
Tenete a mente che, quando ha invertito questo è in realtà l'aggiunta di un campo per un modello ; se il campo non è annullabile, è possibile che questa operazione sia irreversibile (a parte qualsiasi perdita di dati, che ovviamente è irreversibile).
Tuttavia, tutti facciamo degli errori e, a volte abbiamo solo bisogno -qualche modo invertire una delezione campo, anche se questo significa fornire manualmente un valore ad hoc stub per tutti i campi non nulli invertiti. Ad esempio, le migrazioni Sud consentono facoltativamente l'inversione di tali operazioni (chiedendo allo sviluppatore se fornire un valore predefinito per i campi ripristinati, o non consentire la migrazione inversa), il che non sembra essere il caso delle nuove migrazioni di Django 1.7 .
Domanda: qual è il modo più semplice/veloce per annullare la rimozione di un campo con le migrazioni di Django 1.7+ (supponendo che sia già successo)? Non ha necessariamente bisogno di essere completamente scriptato con Python, un insieme di istruzioni manuali funzionerà.
'AlterField' non accetta l'argomento' preserve_default' (ma non sembra essere necessario in questo caso, dato che 'default' non raggiunge comunque lo schema del database). Oltre a ciò, questa sembra essere una soluzione corretta e ottimale. Grazie! –
Secondo [documentazione] (https://docs.djangoproject.com/en/1.7/ref/migration-operations/#django.db.migrations.operations.AlterField), sì, ma è stato aggiunto in 1.7. 1. E in tal caso, preserve_default non dovrebbe avere importanza. Arriva al database, ma solo per un breve periodo. – GwynBleidD
Questo non sembra funzionare in Django 1.8 – jess