据我所知this database design question,您应该谨慎使用可空字段,并且每次都要考虑是否更好地重新考虑数据设计。
但是,让我们说在某些特定情况下,解决方案是允许文本字段包含空值。比如,有user
表和short_bio
列,由Django中的TextField表示,并非强制性。创建一个单独的user_bio
表是没有意义的,对吧?
现在的问题是,空值应为空字符串还是空标记?每种选择的利弊是什么?有没有关于Django如何与数据库一起工作的具体信息呢?
应该注意,django-lint目前使用null=True
报告CharField和TextField实例。
相反,'{3}}'将空字符串存放为空白字符串被视为不良主意'。
答案 0 :(得分:17)
我认为当'empty string'意味着'没有值'时,应该使用空字符串以避免混合空值和空格意味着同样的事情(例如在搜索或比较中:在某些DBMS中你无法比较NULL直接为NULL,必须使用IS NULL
运算符。
使用空字符串也会更容易在报告和其他使用'short_bio'的东西中使用它而不通过DOM(例如使用objects.values('short_bio')
),而不会在'中转换Null' ”。
此外,Django docs州:
避免在基于字符串的字段(如CharField和TextField)上使用null,除非您有充分的理由。如果基于字符串的字段具有null = True,则表示它具有“无数据”的两个可能值:NULL和空字符串。在大多数情况下,为“无数据”提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL。
答案 1 :(得分:5)
如果您需要一个应该是唯一但可以允许多个NULL值的可空文本字段,那么使用NULL而不是空字符串可能更好。
Django始终将NULL视为唯一值,同时空字符串始终等于另一个空字符串。请参阅Unique fields that allow nulls in Django和ticket 9039。
要拥有“两全其美”,您可以将空值存储为NULL,但通过自定义表单字段显示为空字符串。一个(未经测试的)示例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