Django模型空白=假不起作用?

Posted

技术标签:

【中文标题】Django模型空白=假不起作用?【英文标题】:Django model blank=False does not work? 【发布时间】:2013-07-22 21:06:16 【问题描述】:

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

另一个问题:

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

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

【问题讨论】:

首先,这是怎么回事name = ... 不要这样做。 我相信 Games 指的是缩进。不建议按照 PEP-8 进行编码实践。 @bernie 是的,正是我想要得到的。 【参考方案1】:

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

【讨论】:

我从来不知道。学到了一些新东西。 这太离谱了。实际上,在后端创建时似乎需要进行一些手动检查......另一个可能的解决方法是为这些 CharFields 设置 default=None。【参考方案2】:

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

【讨论】:

以上是关于Django模型空白=假不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

DateField 的 Django 模型过滤器不起作用

Django 模型字段可调用默认值不起作用

使用 Django 时,save() 函数在使用模型表单时不起作用

django 模型 CharField:max_length 不起作用?

模型表单上的 Django 自定义设置大小属性不起作用

Django 数据库模型“unique_together”不起作用?