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
Person.objects.all()
,它会给您一个列表,如果您将其保存到一个名为user_list
的变量中并执行类似user_list[0]
的操作,它将返回一个带有空字符串的用户对象。我不知道它是如何或为什么这样做的。