【发布时间】:2015-04-10 09:11:06
【问题描述】:
我想更改我的一个模型中的一个外键,该模型当前可以具有 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 之前没有“提交”数据库中的更改。
如果这确实是原因 - 我如何确保更改反映在数据库中? 如果不是 - 错误的原因是什么?
谢谢!
【问题讨论】:
-
想到的第一个想法,拆分它。先进行数据迁移,然后让你的字段不是 Null。
-
是的,我想到了这种方法,但我想知道是否有办法避免这种情况并在同一个迁移中完成所有操作