19

我在 Django 1.5 中有以下模型:

class Person(models.Model):
    name = models.CharField(max_length=50)

请注意,根据https://docs.djangoproject.com/en/dev/ref/models/fields/name.blank 默认为 False,这意味着必须指定它。

但是,我可以成功地创建一个 Person 对象,如下所示:

Person.objects.create()

请注意,未指定名称。到底是怎么回事?

好的,文档的答案是:

请注意,这与 null 不同。null 纯粹与数据库相关,而空白与验证相关。如果一个字段有空白=真,表单验证将允许输入一个空值。如果某个字段的空白=False,则该字段将是必需的。

另一个问题:

请注意,当您保存模型时,验证器不会自动运行,但如果您使用的是 ModelForm,它将在表单中包含的任何字段上运行您的验证器。

如果您不使用表单,则在保存之前调用 clean 方法是您的责任。

4

2 回答 2

17

blank仅适用于 admin、django 表单等中的表单字段验证。
null另一方面是数据库级可为空的列。

至于为什么空白会导致默认值'',我真的只是接受它为“这就是它的工作方式”,但它似乎在django.db.models.Field

  def get_default(self):
        """
        Returns the default value for this field.
        """
        if self.has_default():
            if callable(self.default):
                return self.default()
            return force_unicode(self.default, strings_only=True)
        if (not self.empty_strings_allowed or (self.null and
                   not connection.features.interprets_empty_strings_as_nulls)):
            return None
        return ""  
        #       ^ this
于 2013-07-23T17:12:42.640 回答
0

Django 使用空字符串创建您的用户。您实际上可以运行Person.objects.all(),它会给您一个列表,如果您将其保存到一个名为的变量user_list并执行类似的操作user_list[0],它将返回一个带有空字符串的用户对象。我不知道它是如何或为什么这样做的。

于 2013-07-23T16:53:18.027 回答