2015-04-01 21 views
4

我在Django 1.7中工作,並試圖將名爲is_dispensing的數據庫字段從現有的BooleanField遷移到NullBooleanFieldDjango:遷移到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列。

+2

我想是怎麼回事是第一個遷移(創建'BooleanField(空=真,空=真)'沒有完全執行,因爲Django 1.7不允許純BooleanField字段具有空值,所以'makemigrations'運行但是'migrate'失敗了。我認爲呢?我仍然不是真的瞭解如何在數據庫中不存在該列時獲得'IntegrityError'! – Richard 2015-04-01 14:20:37

+1

blank = True僅影響生成(例如在管理員中)。它不會影響實際的數據庫表。嘗試使用manage.py migrate --fake。這會在你的遷移表中添加一個條目,你需要檢查數據庫表,看他們是否真的有NO T NULL或不是手動更新它們。不是一個完美的解決方案,但我需要看到遷移文件通過django遷移來修復它。 – 2015-11-08 14:43:57

回答

0

slu and和您的應用程序在項目表中的非獨特組合可能會導致此錯誤。我通過手動編輯確保我的所有項目slu were是唯一的。

您可以添加空白= TRUE外鍵定義,刪除所有遷移並再次運行migraions ...