Desidero modificare una chiave esterna in uno dei miei modelli che al momento può avere valori NULL non annullabili.Migrazioni di Django con RunPython per eseguire il commit delle modifiche
ho rimosso il null=True
dal mio campo e corse makemigrations
perché io sono un alterare una tabella che ha già le righe che contengono i valori NULL in quel campo mi viene chiesto di fornire un valore una tantum subito o modificare il file di migrazione e aggiungere un'operazione RunPython
.
L'operazione My RunPython è elencata PRIMA dell'operazione AlterField
e fa l'aggiornamento richiesto per questo campo in modo che non contenga valori NULL (solo le righe che già contengono un valore NULL).
Ma, la migrazione non riesce ancora con questo errore: django.db.utils.OperationalError: cannot ALTER TABLE "my_app_site" because it has pending trigger events
Ecco il mio codice:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
def add_default_template(apps, schema_editor):
Template = apps.get_model("my_app", "Template")
Site = apps.get_model("my_app", "Site")
accept_reject_template = Template.objects.get(name="Accept/Reject")
Site.objects.filter(template=None).update(template=accept_reject_template)
class Migration(migrations.Migration):
dependencies = [
('my_app', '0021_auto_20150210_1008'),
]
operations = [
migrations.RunPython(add_default_template),
migrations.AlterField(
model_name='site',
name='template',
field=models.ForeignKey(to='my_app.Template'),
preserve_default=False,
),
]
Se ho capito si può verificare in modo corretto questo errore quando un campo viene alterato per essere non annullabile, ma il campo contiene valori nulli. In questo caso, l'unica ragione per cui riesco a pensare perché ciò accade è perché la transazione dell'operazione RunPython
non "ha commesso" le modifiche nel database prima di eseguire AlterField
.
Se questo è davvero il motivo: come posso assicurarmi che le modifiche si riflettano nel database? In caso contrario - quale può essere la causa dell'errore?
Grazie!
Primo pensiero che viene in mente, dividerlo. Effettua prima la datamigration, quindi rendi il tuo campo non Null. – danielcorreia
Sì, ho pensato a questo approccio, ma volevo sapere se c'è un modo per evitarlo e fare tutto nella stessa migrazione –