【问题标题】:Nullable TextField or empty string in Django model?Django模型中的可空文本字段或空字符串?
【发布时间】:2011-06-28 06:07:09
【问题描述】:

据我从this database design question 了解到,您应该谨慎使用可空字段,并且每次都要权衡是否应该重新考虑数据设计。

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

现在的问题是,空值应该是空字符串还是空标记?每个选项的优缺点是什么? Django 与数据库的工作方式是否有任何细节可以产生影响?


需要注意的是,django-lint 目前使用null=True 报告 CharField 和 TextField 实例。

相反,some developers 认为“为留空的字段存储空字符串被视为一个坏主意”。

【问题讨论】:

    标签: django database-design


    【解决方案1】:

    如果您需要一个可以为空的文本字段,该字段应该是唯一的但允许多个 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
    

    【讨论】:

      【解决方案2】:

      我认为当“空字符串”表示“无值”时,应使用空字符串以避免混淆表示同一事物的空值和空格(例如在搜索或比较中:在某些 DBMS 中你无法比较直接NULL转NULL,必须使用IS NULL运算符)。

      在报告和其他使用“short_bio”而不通过DOM(例如使用objects.values('short_bio'))的东西中,使用空字符串也可以更轻松地“按原样”使用它,而无需在“”中转换Null。

      另外,Django docs 状态:

      除非您有充分的理由,否则请避免在基于字符串的字段(例如 CharField 和 TextField)上使用 null。如果基于字符串的字段具有 null=True,这意味着它有两个可能的“无数据”值:NULL 和空字符串。在大多数情况下,“无数据”有两个可能的值是多余的; Django 约定是使用空字符串,而不是 NULL。

      【讨论】:

      • 感谢您推理并提及我在文档中没有注意到的 Django 约定。
      猜你喜欢
      • 2013-04-09
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      相关资源
      最近更新 更多