注意:您不必在字段中提供 null=False,blank=False,因为这些是默认使用的值。(请参阅 Django Field __int__ 签名。)。 p>
def __init__(self, verbose_name=None, name=None, primary_key=False,
max_length=None, unique=False, blank=False, null=False,
db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
serialize=True, unique_for_date=None, unique_for_month=None,
unique_for_year=None, choices=None, help_text='', db_column=None,
db_tablespace=None, auto_created=False, validators=(),
error_messages=None):
默认情况下,数据库中的所有字段都是使用NOT NULL 约束创建的。 如果您为特定字段设置 null=True,那么 django 会在您的数据库中的列上设置 NULL。 它是 Python 的 None 关键字的数据库等效项。
null 参数示例
假设我的my_app 中有以下Mymodel,并将email 字段设置为null=True。
class MyModel(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(max_length=100, null=True)
password = models.CharField(max_length=120)
email_notification = models.BooleanField()
在外壳中,
>> from my_app.models import MyModel
>> new = MyModel.objects.create(name="ok",
password="dsfdsfdsfdsfsfds",
email_notification=1)
>> new.email == None
>> True # As you can see Django sets db value
# as NULL and when we query the data it converts back to Python `None` object.
不带 null 参数的示例
假设我的my_app 中有以下Mymodel。(记住null 默认为False)
class MyModel(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(max_length=100)
password = models.CharField(max_length=120)
email_notification = models.BooleanField()
在外壳中,
>> from my_app.models import MyModel
>> new_obj = MyModel.objects.create(name="test",
password="test",
email_notification=1)
>> new_obj.email == ''
>> True
即,Django CharField 和TextField 默认值作为空字符串('')存储在数据库中。换句话说,如果你创建一个对象而不提供 CharField(或 TextField)的值,Django 会调用 get_default 方法并返回 ''(仅在这种情况下)。该值将存储在数据库中。
以下是get_default方法的源码。
def get_default(self):
"""Return the default value for this field."""
return self._get_default()
@cached_property
def _get_default(self):
if self.has_default():
if callable(self.default):
return self.default
return lambda: self.default
if not self.empty_strings_allowed or self.null and not connection.features.interprets_empty_strings_as_nulls:
return return_None
return str # return empty string
让我们回答你的问题:
为什么要创建对象,即使电子邮件字段是强制性的?
答案是EmailField 是CharField 的一个实例,因此在数据库中创建对象时将使用默认值''。这就是为什么你没有收到django.db.utils.IntegrityError。
>> new_obj = Mymodel.objects.create(name='tes1t', password='test1', email_notification=1)
>>> new_obj.email
''
另外,如果我转到管理面板并打开该对象并单击保存然后
它会引发一个错误,表明需要电子邮件
记住blank 与null 不同。 null 纯粹与数据库相关,而 blank 与验证相关。 所以当你直接在 Python 代码中创建一个对象,或者自己执行原始 SQL 时,你实际上是绕过了 Django 的所有输入验证。但是在 admin 中,Django 是通过模型表单来验证输入的。由于在您的情况下 blank 设置为 False(不允许空白),模型表单将引发 Email is required 错误。
这里是 blank 参数的相关 Django 文档。
字段.空白
如果为 True,则该字段允许为空。默认为假。笔记
这与 null 不同。 null 纯粹与数据库相关,
而空白与验证相关。如果一个字段有空白=真,形成
验证将允许输入空值。如果一个字段有
blank=False,该字段为必填项。
其他资源