当我们在Django中添加模型字段时,我们通常这样写:
models.CharField(max_length=100, null=True, blank=True)
ForeignKey, DecimalField等也是如此。两者的基本区别是什么:
null = True只
空白= True只
null=True, blank=True
对于不同的(CharField, ForeignKey, ManyToManyField, DateTimeField)字段?使用选项1、2或3的优点/缺点是什么?
默认值为“null”和“blank”为“False”。
Null:与数据库相关。定义给定的数据库列是否接受空值。
Blank:这是验证相关的。它将在表单验证期间调用form.is_valid()时使用。
也就是说,有一个null=True和blank=False的字段是完全没问题的。意思是在数据库级别上,该字段可以为NULL,但在应用程序级别上,它是必需的字段。
现在,大多数开发人员都犯了错误:为基于字符串的字段(如CharField和TextField)定义null=True。避免这样做。否则,你最终会有两个可能的“无数据”值,即:None和一个空字符串。对于“无数据”有两个可能的值是多余的。Django的约定是使用空字符串,而不是NULL。
默认值为“null”和“blank”为“False”。
Null:与数据库相关。定义给定的数据库列是否接受空值。
Blank:这是验证相关的。它将在表单验证期间调用form.is_valid()时使用。
也就是说,有一个null=True和blank=False的字段是完全没问题的。意思是在数据库级别上,该字段可以为NULL,但在应用程序级别上,它是必需的字段。
现在,大多数开发人员都犯了错误:为基于字符串的字段(如CharField和TextField)定义null=True。避免这样做。否则,你最终会有两个可能的“无数据”值,即:None和一个空字符串。对于“无数据”有两个可能的值是多余的。Django的约定是使用空字符串,而不是NULL。
在模型中null=True和blank=True的含义还取决于这些字段在表单类中的定义方式。
假设你已经定义了以下类:
class Client (models.Model):
name = models.CharField (max_length=100, blank=True)
address = models.CharField (max_length=100, blank=False)
如果表单类是这样定义的:
class ClientForm (ModelForm):
class Meta:
model = Client
fields = ['name', 'address']
widgets = {
'name': forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
'address': forms.TextInput (attrs = {'class': 'form-control form-control-sm'})
}
然后,'name'字段将不是强制性的(由于模型中的空白=True), 'address'字段将是强制性的(由于模型中的空白=False)。
然而,如果ClientForm类是这样定义的:
class ClientForm (ModelForm):
class Meta:
model = Client
fields = ['name', 'address']
name = forms.CharField (
widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
)
address = forms.CharField (
widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
)
然后,这两个字段('name'和'address')将是强制性的,“因为声明式定义的字段保持原样”(https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/),即表单字段的'required'属性的默认值为True,这将要求字段'name'和'address'被填充,即使在模型中,字段已被设置为blank=True。