簡體   English   中英

django.db.utils.IntegrityError:NOT NULL 約束失敗:app.area_id

[英]django.db.utils.IntegrityError: NOT NULL constraint failed: app.area_id

當我運行./manage.py migrate ,會發生錯誤django.db.utils.IntegrityError: NOT NULL constraint failed: app.area_id models.py

class Area(models.Model):
    name = models.CharField(max_length=20, verbose_name='area', null=True)

class User(models.Model):
    name = models.CharField(max_length=200,null=True)
    age = models.CharField(max_length=200,null=True)
    area = models.ForeignKey('Area', default="")

class Prefecture(models.Model):
    name = models.CharField(max_length=20, verbose_name='city')
    area = models.ForeignKey('Area')

class City(models.Model):
    name = models.CharField(max_length=20, verbose_name='region')
            prefecture = models.ForeignKey('Prefecture')

class Price(models.Model):
    name = models.CharField(max_length=20, verbose_name='price')
            PRICE_RANGE = (
                ('a', 'under500'),
                ('b', '500-1000'),
                ('c', 'upper1000'),
            )
    price_range = models.CharField(max_length=1, choices=PRICE_RANGE)
    city = models.ForeignKey('City')

當我寫area = models.ForeignKey('Area') ,我得到一個錯誤你試圖在沒有默認值的情況下向事務添加一個不可為空的字段“區域”; 我們不能這樣做(數據庫需要一些東西來填充現有的行)。 請選擇一個修復:1)現在提供一次性默認值(將在所有現有行上設置此列的空值)2)退出,讓我在models.py添加一個默認值。 怎么了? 我怎樣才能解決這個問題?

現在models.py是

class Area(models.Model):
    name = models.CharField(max_length=20, verbose_name='area', null=True)

class User(models.Model):
    name = models.CharField(max_length=200,null=True)
    age = models.CharField(max_length=200,null=True)
    area = models.ForeignKey('Area', default="")

class Prefecture(models.Model):
    name = models.CharField(max_length=20, verbose_name='city')
    area = models.ForeignKey('Area', null=True, blank=True)

class City(models.Model):
    name = models.CharField(max_length=20, verbose_name='region')
            prefecture = models.ForeignKey('Prefecture', null=True, blank=True)

class Price(models.Model):
    name = models.CharField(max_length=20, verbose_name='price')
            PRICE_RANGE = (
                ('a', 'under500'),
                ('b', '500-1000'),
                ('c', 'upper1000'),
            )
    price_range = models.CharField(max_length=1, choices=PRICE_RANGE)
    city = models.ForeignKey('City', null=True, blank=True)

我也遇到了同樣的錯誤。我已經嘗試過 cache.clear() 。

在下面的模型中,您嘗試將區域添加為外鍵。 由於這個Prefecture表已經有一些數據,Django 不知道在現有行的區域字段中添加什么。

class Prefecture(models.Model):
    name = models.CharField(max_length=20, verbose_name='city')
    area = models.ForeignKey('Area') # non null-able field Django does
                                     # not know what to add

簡單的解決方案。 提供默認值或添加空值

class Prefecture(models.Model):
        name = models.CharField(max_length=20, verbose_name='city')
        area = models.ForeignKey('Area', null=True)

注意:對於現在Prefecture所有現有行, area字段將為空。 您現在可以為新行添加此字段。

您首先需要刪除之前生成的遷移文件。

否則,即使您修復了models.py ,您也會不斷收到相同的錯誤,因為./manage.py migrate將繼續嘗試應用先前的遷移。

刪除之前生成的遷移文件后,使用以下命令:

area = models.ForeignKey('Area', blank=True, null=True)

這將使area屬性可選,您將能夠生成新的遷移文件並繼續./manage.py migrate

完成此操作后,您可以選擇編寫數據遷移腳本來填充缺失的area屬性。 您可以在文檔中閱讀更多信息。

您還可以為現有數據手動填寫此屬性,而不是編寫遷移腳本(例如,購買直接更新數據庫或使用 django-admin)。

確保所有數據都填充了area屬性后,您可以進行最終更改:

area = models.ForeignKey('Area')

當您應用此遷移時,您只需在數據庫中的此字段中添加一個 NOT NULL 約束,如果您在上一步中填寫了數據,則應該可以。

如上面的答案,[null = True] 可用,我建議另一個 [default = None] 也可用

您可能還沒有執行makemigrationmigrate

我面臨以下錯誤:

django.db.utils.IntegrityError: NOT NULL 約束失敗: adminapp_responses.created_by_id

但是在makemigrationmigrate ,它就消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM