Django model blank=False不起作用



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纯粹与数据库相关,而blank则与验证相关。如果字段的值为空=True,表单验证将允许输入空值。如果某个字段为blank=False,则该字段将是必填字段。

另一个陷阱:

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

如果你不使用表单,你有责任在保存之前调用干净的方法。

blank仅适用于admin、django表单等中的表单字段验证。
另一方面,null是数据库级别的可为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
Django用一个空字符串创建用户。实际上,您可以运行Person.objects.all(),它会给您一个列表,如果您将其保存到一个名为user_list的变量中并执行类似user_list[0]的操作,它将返回一个带有空字符串的用户对象。我不知道它是如何或为什么这样做的。

最新更新