📜  null=True – Django 内置字段验证(1)

📅  最后修改于: 2023-12-03 15:33:13.764000             🧑  作者: Mango

null=True – Django 内置字段验证

当使用 Django ORM 时,在定义模型时,您可能会希望一些字段可以为空。但是,这可能会导致未定义的行为。因此,Django 带有一个内置参数,即 null=True。本文将介绍这个参数的使用方法。

什么是 null?

在数据库中,NULL 是一个未知值或不存在值的标记,表示其值或数据未知或不适用。例如,针对可以为空的文本字段,如果未填写文本,则该字段将设置为 NULL。可以通过使用查询操作来确定哪些行的该字段是 NULL,并在查询结果中输出与该字段相关的值。

null=True 的作用

当使用 Django ORM 定义模型时,您可以将某些字段设置为可以为空。这意味着,在模型实例化期间,您可以不设置这些字段中任何字段的值。但是,如果您未使用 null=True 参数在这些字段中设置为可空,Django 将会引发数据库完整性异常。

例如,以下示例定义了一个名为 Person 的模型,其中 middle_name 字段可以为空:

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    middle_name = models.CharField(max_length=50, null=True)
    last_name = models.CharField(max_length=50)

使用上述模型,您可以实例化 Person 对象并跳过中间名称的设置:

person = Person(first_name="John", last_name="Doe")

在执行数据库更改之前,这个 person 可以与其他模型实例一起被序列化和保存。

null=True 还是 blank=True

如果您熟悉 Django 模型,您可能知道 blank=True 参数表示字段为可选字段,null=True 表示该字段可以存储数据库中的空值。

这两个参数的差异可以用以下示例说明:

class Example(models.Model):
    field1 = models.CharField(max_length=255, blank=True)
    field2 = models.CharField(max_length=255, null=True)

obj = Example.objects.create()
obj.field1 is ""         # True
obj.field2 is None       # True

obj.field1 is None       # False
obj.field2 is ""         # False
注意事项

还有一些注意事项,在使用 null=True 时需要注意:

  1. 对于一对一关系,如果您希望创建一个空关系,则应使用 on_delete=models.SET_NULL 声明关系。
  2. 对于多对多关系,使用 blank=Truenull=True 允许创建一个空的 ManyToManyField,因为其 add()create() 方法需要至少一个参数作为目标模型实例。
  3. IntegerFieldFloatField 字段类型不支持 blank=True,因为它们不接受空的字符串。
  4. 不支持 null=True 的某些其他字段类型。在其它字段类型上使用 null=True 之前,请务必阅读官方文档。
总结

在 Django ORM 中,通过将字段的 null=True 添加到模型定义中来表示允许该字段为空。如果该字段不可为空且未设置,则 Django ORM 将引发异常。 您可以使用 blank=Truenull=True 中的一种或两种来将字段设置为空白字符或空值。 如果需要详细了解关于 Django ORM,请查看官方的文档。