如果在某些地方已经有空值,如何将 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=Truenull=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 字段?的主要内容,如果未能解决你的问题,请参考以下文章

如果字段为NULL,如何返回默认值?

将所有空字符串属性设置为 null

RestTemplate传输值为null的属性利用FastJson将属性中有空值null的对象转化成Json字符串

如何设置TextBox空字符串的默认值而不是null

linq中默认填充Select = null

oracle如何快速判断表中的某列是不是有空值