2011-08-18 36 views
11

Django的文檔有關存儲空字符串爲「」,而不是在數據庫級別NULL(所以只有一個空的數據可能格式)相當明確:Django的ORM,CharField和空白=真

注空字符串值將始終作爲空字符串存儲,而不是NULL。只對非字符串字段(如整數,布爾值和日期)使用null = True。對於這兩種類型的字段,如果您希望允許表單中的空值,您還需要設置blank = True,因爲null參數僅影響數據庫存儲(請參見空白)。

儘管如此,添加新字段後,我開始在新字段(phone_number)上遇到IntegrityErrors。

列「PHONE_NUMBER」

空值違反

這種模式看起來是這個新的領域(我執行經由南部遷移)非空約束:

class Person(models.Model): 
    user = models.ForeignKey(User) 
    description = models.TextField(blank=True) 
    phone_number = models.CharField(blank=True) 

我自從(暫時)通過在phone_number上設置null = True解決了這個問題,但現在我有數百個空字符串的條目,並且在我的數據庫中有一個NULL值。 (我也嘗試在phone_number字段中添加default ='',但我仍然看到IntegrityError問題。)

在過去,我一直使用MySQL,但在此項目中,我使用Postgres。生成的SQL插入嘗試是:

'INSERT INTO "people_person" ("user_id", "description", "gender", "birthdate", "default_image_id", "zip_code", "beta_status") VALUES (%s, %s, %s, %s, %s, %s, %s) RETURNING "people_person"."id"'

我的期望是Django會在「phone_number」列中插入一個空白字符串,但它似乎沒有這樣做。我可能期望的另一件事是Django在CREATE TABLE語句中包含SET DEFAULT,但它不包含。所以Postgres對那列的NOT NULL感到憤怒。

謝謝!

回答

7

通常情況下,看似棘手的問題通常就是用戶錯誤。

我的應用程序有兩個入口點 - 兩個WSGI文件,但只有一個代碼庫。通常情況下,如果文件被觸摸,Apache將只會重新載入您的代碼。我的部署腳本只觸及其中一個WSGI文件 - 這意味着通過另一個WSGI文件到達我的網站的人仍然看到舊的代碼。更糟的是,數據庫在舊代碼下被修改,但模型仍然像以前一樣。

這又導致了IntegrityError問題。 Django不知道phone_number這個字段,所以即使我設置了blank=True,Django也沒有插入一個空值 - 而且當然數據庫認爲這意味着NULL。

這導致了一系列不同的追查錯誤,包括上述錯誤。

令人驚訝的是,這些難以處理的問題多半是由於愚蠢的小漏洞造成的 - 就像我2個月前寫的部署腳本,忘記了更新。

感謝讀者們,我已經提出了其他答案,但我需要接受我的,因爲它最終是解決方案。

6

我發現如果你明確地設置字段值爲None,你仍然會得到這些錯誤。換句話說,default=事物在您創建python對象後立即應用,而不是在您將其保存到數據庫時應用。

我想這是合理的,但有點意外。

+0

同樣的事情似乎發生如果你傳遞一個'None'給構造函數(所以,在創建時) –