Django模型中可空的TextField或空字符串?

时间:2011-02-16 10:09:43

标签: django database-design

据我所知this database design question,您应该谨慎使用可空字段,并且每次都要考虑是否更好地重新考虑数据设计。

但是,让我们说在某些特定情况下,解决方案是允许文本字段包含空值。比如,有user表和short_bio列,由Django中的TextField表示,并非强制性。创建一个单独的user_bio表是没有意义的,对吧?

现在的问题是,空值应为空字符串还是空标记?每种选择的利弊是什么?有没有关于Django如何与数据库一起工作的具体信息呢?


应该注意,django-lint目前使用null=True报告CharField和TextField实例。

相反,'{3}}'将空字符串存放为空白字符串被视为不良主意'。

2 个答案:

答案 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 Djangoticket 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