Я хочу изменить внешний ключ в одной из моих моделей, у которых в настоящее время значения NULL не могут быть обнуляемыми.
Я удалил null=True из своего поля и запустил makemigrations
Поскольку я изменяю таблицу, у которой уже есть строки, которые содержат значения NULL в этом поле, мне предлагается сразу предоставить одноразовое значение или отредактировать файл миграции и добавить операцию RunPython.
Моя операция RunPython отображается перед операцией AlterField и выполняет необходимое обновление для этого поля, поэтому оно не содержит значений NULL (только строки, которые уже содержат значение NULL).
Но миграция по-прежнему не выполняется с этой ошибкой:
django.db.utils.OperationalError: cannot ALTER TABLE "my_app_site" because it has pending trigger events
Здесь мой код:
# -*- 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,
        ),
    ]
Если я правильно понимаю, эта ошибка может возникнуть, когда поле изменено, чтобы оно не было нулевым, но поле содержит нулевые значения.
В этом случае единственная причина, по которой я могу понять, почему это происходит, заключается в том, что транзакция операции RunPython не "фиксировала" изменения в базе данных до запуска AlterField.
Если это действительно причина - как я могу убедиться, что изменения отражены в базе данных? Если нет - что может быть причиной ошибки?
Спасибо!