如果在某些地方已经有空值,如何将 null=True 字段更改为 null=False 字段?
Posted
技术标签:
【中文标题】如果在某些地方已经有空值,如何将 null=True 字段更改为 null=False 字段?【英文标题】:How can I change a null=True field to a null=False field if it already has null values in some places? 【发布时间】:2018-02-01 05:59:59 【问题描述】:django.db.utils.OperationalError: cannot ALTER TABLE "news_article" because it has pending trigger events
所以,我有以下问题:
我有一个 Django 类 Article,它包含几个 Char- 和 TextFields。它们被设置为blank=True
和null=True
,这是……不幸的。哦,好吧,不,我需要解决这个问题。所以在我删除null=True
并设置default=''
后,我在迁移中写了以下内容:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import languagefields.utils
from languagefields.utils import LANGUAGES
from django.utils.translation import activate
from news.models import Article
def null_migrations(apps, schema_editor):
activate('en')
fields = ['short_title', 'description']
for p in Article.objects.all():
for l in LANGUAGES:
for f in fields:
if p.get_language(l, f) is None:
p.set_localized(l, f, '')
p.save()
class Migration(migrations.Migration):
dependencies = [
('news', '0001_initial'),
]
operations = [
migrations.RunPython(null_migrations),
migrations.AlterField(....
这些字段是基于默认 Char-/TextFields 的自定义字段,可启用翻译。所以有一堆。对于您创建的每个字段,将有 5 个,用英语、德语等进行描述......所以是的,这个小功能工作正常,我在服务器上运行它并手动清理了数据库条目,但这并没有停止上述例外。所以我想我会把它放在迁移中,以便在旅途中进行清理。但仍然是个例外。我做错了什么?
提前谢谢你:)
编辑
将迁移一分为二:
0002_null_cleaning.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import languagefields.utils
from languagefields.utils import LANGUAGES
from django.utils.translation import activate
from news.models import Article
def null_migrations(apps, schema_editor):
activate('en')
fields = ['short_title', 'description']
for p in Article.objects.all():
for l in LANGUAGES:
for f in fields:
if p.get_language(l, f) is None:
p.set_localized(l, f, '')
p.save()
class Migration(migrations.Migration):
dependencies = [
('news', '0001_initial'),
]
operations = [
migrations.RunPython(null_migrations),
]
0003_data_migration
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import languagefields.utils
class Migration(migrations.Migration):
dependencies = [
('news', '0002_null_cleaning'),
]
operations = [
migrations.AlterField(...
同样的错误,发生在0003
【问题讨论】:
Django-DB-Migrations: cannot ALTER TABLE because it has pending trigger events的可能重复 【参考方案1】:我认为您必须将迁移拆分为 2 个实际迁移。它们应该发生在事务中,因此更改数据和更改表可能不符合规定。只需创建两个迁移,它应该可以工作。
【讨论】:
我试着这样做,把它分开。我编辑了我的帖子以展示我是如何做到的。它没有改变任何东西,你知道我在那里做错了吗?以上是关于如果在某些地方已经有空值,如何将 null=True 字段更改为 null=False 字段?的主要内容,如果未能解决你的问题,请参考以下文章