📅  最后修改于: 2023-12-03 15:33:13.764000             🧑  作者: Mango
当使用 Django ORM 时,在定义模型时,您可能会希望一些字段可以为空。但是,这可能会导致未定义的行为。因此,Django 带有一个内置参数,即 null=True
。本文将介绍这个参数的使用方法。
在数据库中,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
时需要注意:
on_delete=models.SET_NULL
声明关系。blank=True
和 null=True
允许创建一个空的 ManyToManyField
,因为其 add()
和 create()
方法需要至少一个参数作为目标模型实例。IntegerField
和 FloatField
字段类型不支持 blank=True
,因为它们不接受空的字符串。null=True
的某些其他字段类型。在其它字段类型上使用 null=True
之前,请务必阅读官方文档。在 Django ORM 中,通过将字段的 null=True
添加到模型定义中来表示允许该字段为空。如果该字段不可为空且未设置,则 Django ORM 将引发异常。 您可以使用 blank=True
和 null=True
中的一种或两种来将字段设置为空白字符或空值。 如果需要详细了解关于 Django ORM,请查看官方的文档。