Django:迁移到NullBooleanField失败,并出现IntegrityError“包含空值”

Ric*_*ard 5 python django django-orm django-migrations

我正在Django 1.7中进行操作,并尝试将一个数据库字段is_dispensing从现有字段迁移BooleanFieldNullBooleanField

我的迁移文件:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations

class Migration(migrations.Migration):

    dependencies = [
        ('frontend', '0007_practice_is_dispensing'),
    ]

    operations = [
        migrations.AlterField(
            model_name='practice',
            name='is_dispensing',
            field=models.NullBooleanField(),
            preserve_default=True,
        ),
    ]
Run Code Online (Sandbox Code Playgroud)

运行manage.py migrate失败,并显示以下错误:

django.db.utils.IntegrityError: column "is_dispensing" contains null values
Run Code Online (Sandbox Code Playgroud)

我的模型文件中的字段:

is_dispensing = models.NullBooleanField(blank=True)
Run Code Online (Sandbox Code Playgroud)

以前是:

is_dispensing = models.BooleanField(null=True, blank=True) 
Run Code Online (Sandbox Code Playgroud)

当我添加它时,要求我提供一个默认值,我将其设置为“无”。

我发现此消息令人困惑-我正在尝试将列类型迁移到NullBooleanField,为什么它不能包含空值?这就是该列类型的重点,不是吗?:)

更新:另一个令人困惑的事情是:如果我进入Postgres并查看应该具有该列的表,那么实际上它根本没有任何is_dispensing列。

小智 0

项目表中的 slugs 和应用程序的非唯一组合可能会导致此错误。我通过手动编辑确保所有项目 slugs 都是唯一的来修复此问题。

您可以添加空白= true外键定义,删除所有迁移并再次运行迁移...