2011-02-16 60 views
8

據我所知,從this database design question開始,應該謹慎使用可空字段,並且每次都要重新考慮數據設計是否會更好。Django模型中可空的TextField或空字符串?

但讓我們說在某些特定情況下,解決方案是允許文本字段包含一個空值。假設有user表,並且有short_bio列,它由Django中的TextField表示,並且不是必需的。創建單獨的user_bio表沒有意義,對嗎?

現在的問題是,空值應該是空字符串還是空標記?每種選擇有什麼優點和缺點? Django如何與數據庫協同工作,有什麼特別之處?


應當指出的是,django-lint目前CharField和TextField實例報告與null=True

相反,'空字段存儲空字符串被認爲是壞主意'some developers

回答

16

我認爲當'空字符串'表示'沒有值'時,應該使用空字符串以避免混合空值和空白意味着相同的東西(例如在搜索或比較中:在某些DBMS中,您不能直接將NULL與NULL進行比較,必須使用IS NULL運算符)。

使用空字符串還可以更輕鬆地在報告和其他使用'short_bio'但不通過DOM(例如使用objects.values('short_bio'))而不使用Null轉換的東西中使用它。

此外,Django docs狀態:

避免基於字符串的領域,如CharField和TextField使用空,除非你有一個很好的理由。如果基於字符串的字段的值爲空= True,則表示它有兩個可能的值:「無數據」:NULL和空字符串。在大多數情況下,「無數據」有兩個可能的值是多餘的,Django約定是使用空字符串,而不是NULL。

+2

感謝推理和提Django的約定,我未能文檔注意。 – Tony 2011-02-16 10:57:11

5

如果需要,應該是唯一但允許多個NULL值可空的文本字段,它可能會更好,而不是使用空字符串NULL。

Django總是將NULL看作唯一值,同時空字符串總是等於另一個空字符串。請參閱Unique fields that allow nulls in Djangoticket 9039

要擁有「兩全其美」的優點,您可以將空值存儲爲NULL,但通過自定義表單字段顯示爲空字符串。 A(未測試)例如by mightyhal

from django.db import models 


class CharNullField(models.CharField): 
    description = "Stores NULL but returns empty string" 
    def to_python(self, value): 
     # this may be the value right out of the db, or an instance 
     if isinstance(value, models.CharField): 
      # if an instance, return the instance 
      return value 
     if value == None: 
      # if db has NULL (==None in Python), return empty string 
      return "" 
     else: 
      return value # otherwise, return just the value 
    def get_db_prep_value(self, value): 
     # catches value right before sending to db 
     if value == "": 
      # if Django tries to save an empty string, send to db None (NULL) 
      return None 
     else: 
      return value # otherwise, just pass the value