Я хочу изменить внешний ключ в одной из моих моделей, у которых в настоящее время значения 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
.
Если это действительно причина - как я могу убедиться, что изменения отражены в базе данных? Если нет - что может быть причиной ошибки?
Спасибо!