4
我在Django 1.7中工作,並試圖將名爲is_dispensing
的數據庫字段從現有的BooleanField
遷移到NullBooleanField
。Django:遷移到NullBooleanField失敗,IntegrityError「包含空值」
我的遷移文件:
# -*- 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,
),
]
運行manage.py migrate
失敗,此錯誤:
django.db.utils.IntegrityError: column "is_dispensing" contains null values
場在我的模型文件:
is_dispensing = models.NullBooleanField(blank=True)
以前它是:
is_dispensing = models.BooleanField(null=True, blank=True)
當我添加它時,我被要求提供一個默認值,我將其設置爲None。
我覺得這個消息很混亂 - 我試圖將列類型遷移到NullBooleanField
,爲什麼它不能包含空值?這就是這個列類型的重點,不是嗎? :)
更新:另一件令人困惑的事情是:如果我進入Postgres並查看應該有列的表,它實際上並沒有is_dispensing
列。
我想是怎麼回事是第一個遷移(創建'BooleanField(空=真,空=真)'沒有完全執行,因爲Django 1.7不允許純BooleanField字段具有空值,所以'makemigrations'運行但是'migrate'失敗了。我認爲呢?我仍然不是真的瞭解如何在數據庫中不存在該列時獲得'IntegrityError'! – Richard 2015-04-01 14:20:37
blank = True僅影響生成(例如在管理員中)。它不會影響實際的數據庫表。嘗試使用manage.py migrate --fake。這會在你的遷移表中添加一個條目,你需要檢查數據庫表,看他們是否真的有NO T NULL或不是手動更新它們。不是一個完美的解決方案,但我需要看到遷移文件通過django遷移來修復它。 – 2015-11-08 14:43:57