2015-03-30 159 views
1

Django的文檔說:Django的CharField不默認爲空字符串

避免使用空的基於字符串的領域,如CharField和 文本字段,因爲空字符串值總是會被​​存儲爲空 字符串,而不是空值。

所以我建立我的模型像

class Address(models.Model): 
    address_num = models.TextField() 
    street_predir = models.CharField(max_length=2, default='') # optional 
    street_name = models.TextField() 
    street_suffix = models.CharField(max_length=4, default='') # optional 
    street_postdir = models.CharField(max_length=2, default='') # optional 

,然後創建一個缺少可選字段

raw_address = '1234 MAIN ST' 
# Run this through an address parser - this returns a dictionary of address components 
# Optional fields are returned as None if not present 
components = parser.parse(raw_address) 
address = Address(**components) 
address.save() 

的對象,但我得到的錯誤

null value in column "street_predir" violates not-null constraint 
DETAIL: Failing row contains (8633570, 2057 ANCHOR ST, 2057, null, ANCHOR, ST, null, null, null, ANCHOR ST, null, null,) 

任何人都可以解釋爲什麼這不是默認爲空的條紋NG? FWIW我正在使用Django 1.7.4和Postgres DB。

+0

不需要'default =''',你應該使用'blank = True'來允許表單中的空值。你可以發佈traceback和可能的內容'from django.db import connection;打印(connection.queries)'? – knbk 2015-03-30 18:04:14

+0

您還可以發佈創建對象的代碼或任何自定義保存方法嗎?某處,你明確地設置了'None'而不是一個空字符串。 – knbk 2015-03-30 18:17:45

回答

2
# Run this through an address parser - this returns a dictionary of address components 
# Optional fields are returned as None if not present 
components = parser.parse(raw_address) 

這明確地將值設置爲None,其直接轉換爲NULL在數據庫中。您應該刪除具有價值None所有鑰匙或'',而不是替代的價值:

components = {k: v for k, v in components.items() if v is not None} 

這將只設置非空的成分,和其他人將默認爲一個空字符串,而不是NULL

0

在您粘貼引用的文字,有點後指出:

你還需要設置空白= true如果你希望允許在形式的空值,作爲空參數隻影響數據庫存儲(見空白)。

對於字符串,你應該使用blank=True

class MyModel(models.Model): 
    required_string = models.CharField() 
    optional_string = models.CharField(blank=True, default="") 
+0

雖然我沒有使用任何表單或管理網站 - 這都是通過代碼。我嘗試設置'blank = True',我仍然得到相同的「違反非空約束」:/ – Rob 2015-03-30 18:13:34

+0

不要'忘記'null =真' – 2015-03-30 18:21:53

+0

@ C.B。 「避免在基於字符串的字段(如CharField和TextField)上使用null,如果基於字符串的字段的值爲null = True,則意味着它對於」無數據「有兩個可能的值:NULL和空字符串在大多數情況下,對於「無數據」有兩個可能的值是多餘的,Django約定是使用空字符串,而不是NULL。「 - https://docs.djangoproject.com/en/1.11/ref/models/fields/#null – wizpig64 2017-04-12 21:44:21