我什么时候应该在 django 模型字段上使用 null=False
When should I be using null=False on django model fields
这些问题询问 null
argument 的作用:
differentiate null=True, blank=True in django
In Django models.py, what's the difference between default, null, and blank?
但我想知道,我应该什么时候使用它?
例如,我为什么要限制自己?纯粹是为了在错误发生时捕捉它们吗?作为一般规则,除非我真的需要 True
,否则我应该对所有模型关系使用 null=False
吗?有没有我真的需要的情况?
我的一般规则 heard/used 是您的数据库应该尽可能严格地接受它;您的数据库是您对世界的理解,排除不良数据(或至少引起您的注意)是一个很好的特征。
(当您想使用 model_mommy 生成正确的数据时,字段参数也很有用;它只会生成适合您的字段的数据,因此对它们进行严格定制有助于 CYA 并编写良好的测试。)
default is False,所以简单的路是正确的。只需将您需要的内容标记为可空 :) .
编辑:您可能需要可空性的一个地方是轮询外部数据。如果您正在镜像一个 API,它会在它告诉您有新对象之前使用数据中的新对象,那么您将希望关于该对象的数据可以为空以避免无法保存新数据。
例如:
class Person(models.Model):
""" A person that might tweet """
name = models.CharField(max_length=200)
class Tweet(models.Model):
""" A message broadcast by a person. """
msg = models.TextField()
person = models.ForeignKey('Person')
如果您正在抓取推文并在保存该人之前点击了新人的推文,您可能 get_or_create 一个对象来填充 Tweet.person。但是,您不知道那个人的名字;您可能希望 name 可以为空(并且可能 运行 定期在您的数据库上执行完整性任务以查找并修复这些问题。)
NOT NULL
是一种强制数据完整性的工具,如果该列绝不能为空,这总是一件好事。最好尽早发现错误,而不是后来发现出现问题并且留下不一致或丢失的数据。数据完整性是数据库设计的重要组成部分,因此您应该使用所有可用的工具。
你需要吗?不,你应该在适当的时候使用它吗?确实。当我应该使用 null=False
时,我是否使用了 null=True
?是的,我有。如果您的代码可以正常工作,则没有理由使用 null=False
。但是错误会发生,当它们发生时,您不想发现一半的数据是错误的。
作为后端开发人员,设置最小数据是定义模型所必需的,如果某些字段不是 null=True or blank=True
,数据库将不允许您保存模型,因为他们需要该数据写行。 (内部一致性是 SQL 数据库中的基本行为)
因此,当某个字段不是必需的时,您应该将其标记为 blank=True 或 Null=True,并且您有责任正确标记它们。
此外,django 使用该数据进行表单验证,因此正确地执行此操作将在以后帮助您。
这些问题询问 null
argument 的作用:
differentiate null=True, blank=True in django
In Django models.py, what's the difference between default, null, and blank?
但我想知道,我应该什么时候使用它?
例如,我为什么要限制自己?纯粹是为了在错误发生时捕捉它们吗?作为一般规则,除非我真的需要 True
,否则我应该对所有模型关系使用 null=False
吗?有没有我真的需要的情况?
我的一般规则 heard/used 是您的数据库应该尽可能严格地接受它;您的数据库是您对世界的理解,排除不良数据(或至少引起您的注意)是一个很好的特征。
(当您想使用 model_mommy 生成正确的数据时,字段参数也很有用;它只会生成适合您的字段的数据,因此对它们进行严格定制有助于 CYA 并编写良好的测试。)
default is False,所以简单的路是正确的。只需将您需要的内容标记为可空 :) .
编辑:您可能需要可空性的一个地方是轮询外部数据。如果您正在镜像一个 API,它会在它告诉您有新对象之前使用数据中的新对象,那么您将希望关于该对象的数据可以为空以避免无法保存新数据。
例如:
class Person(models.Model):
""" A person that might tweet """
name = models.CharField(max_length=200)
class Tweet(models.Model):
""" A message broadcast by a person. """
msg = models.TextField()
person = models.ForeignKey('Person')
如果您正在抓取推文并在保存该人之前点击了新人的推文,您可能 get_or_create 一个对象来填充 Tweet.person。但是,您不知道那个人的名字;您可能希望 name 可以为空(并且可能 运行 定期在您的数据库上执行完整性任务以查找并修复这些问题。)
NOT NULL
是一种强制数据完整性的工具,如果该列绝不能为空,这总是一件好事。最好尽早发现错误,而不是后来发现出现问题并且留下不一致或丢失的数据。数据完整性是数据库设计的重要组成部分,因此您应该使用所有可用的工具。
你需要吗?不,你应该在适当的时候使用它吗?确实。当我应该使用 null=False
时,我是否使用了 null=True
?是的,我有。如果您的代码可以正常工作,则没有理由使用 null=False
。但是错误会发生,当它们发生时,您不想发现一半的数据是错误的。
作为后端开发人员,设置最小数据是定义模型所必需的,如果某些字段不是 null=True or blank=True
,数据库将不允许您保存模型,因为他们需要该数据写行。 (内部一致性是 SQL 数据库中的基本行为)
因此,当某个字段不是必需的时,您应该将其标记为 blank=True 或 Null=True,并且您有责任正确标记它们。
此外,django 使用该数据进行表单验证,因此正确地执行此操作将在以后帮助您。