use*_*563 819 python django django-models
当我们在django中添加数据库字段时,我们通常会写models.CharField(max_length=100, null=True, blank=True).同样是用ForeignKey,DecimalField等等.有什么基本的区别
null=True 只要blank=True 只要null=True, blank=True在相对于不同的(CharField,ForeignKey,ManyToManyField,DateTimeField)字段.使用1/2/3有哪些优点/缺点?
Chr*_*att 990
null=True在数据库中的列上设置NULL(对比NOT NULL).Django字段类型的空值,例如DateTimeField或ForeignKey将存储NULL在DB中.
blank=True确定表单中是否需要该字段.这包括管理员和您自己的自定义表单.如果blank=True那时不需要该字段,而如果False该字段不能为空.
两者的组合是如此频繁,因为通常如果您要在表单中允许字段为空,那么您还需要您的数据库来允许NULL该字段的值.例外是CharFields和TextFields,它们在Django中永远不会保存为NULL.空值作为空字符串('')存储在DB中.
几个例子:
models.DateTimeField(blank=True) # raises IntegrityError if blank
models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form
Run Code Online (Sandbox Code Playgroud)
显然,这两个选项在使用时没有逻辑意义(但是,null=True, blank=False如果您希望在表单中始终需要字段,则可能有一个用例,但在通过类似shell的方式处理对象时可选.)
models.CharField(blank=True) # No problem, blank is stored as ''
models.CharField(null=True) # NULL allowed, but will never be set as NULL
Run Code Online (Sandbox Code Playgroud)
CHAR并且TEXT类型永远不会NULL被Django 保存,因此null=True是不必要的.但是,您可以手动将其中一个字段设置None为强制将其设置为NULL.如果您有可能需要的场景,您仍应该包括null=True.
use*_*ser 107
这就是Django 1.8 的ORM映射blank和null字段
class Test(models.Model):
charNull = models.CharField(max_length=10, null=True)
charBlank = models.CharField(max_length=10, blank=True)
charNullBlank = models.CharField(max_length=10, null=True, blank=True)
intNull = models.IntegerField(null=True)
intBlank = models.IntegerField(blank=True)
intNullBlank = models.IntegerField(null=True, blank=True)
dateNull = models.DateTimeField(null=True)
dateBlank = models.DateTimeField(blank=True)
dateNullBlank = models.DateTimeField(null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
为PostgreSQL 9.4创建的数据库字段是:
CREATE TABLE Test (
id serial NOT NULL,
"charNull" character varying(10),
"charBlank" character varying(10) NOT NULL,
"charNullBlank" character varying(10),
"intNull" integer,
"intBlank" integer NOT NULL,
"intNullBlank" integer,
"dateNull" timestamp with time zone,
"dateBlank" timestamp with time zone NOT NULL,
"dateNullBlank" timestamp with time zone,
CONSTRAINT Test_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)
为MySQL 5.6创建的数据库字段是:
CREATE TABLE Test (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`charNull` VARCHAR(10) NULL DEFAULT NULL,
`charBlank` VARCHAR(10) NOT NULL,
`charNullBlank` VARCHAR(10) NULL DEFAULT NULL,
`intNull` INT(11) NULL DEFAULT NULL,
`intBlank` INT(11) NOT NULL,
`intNullBlank` INT(11) NULL DEFAULT NULL,
`dateNull` DATETIME NULL DEFAULT NULL,
`dateBlank` DATETIME NOT NULL,
`dateNullBlank` DATETIME NULL DEFAULT NULL
)
Run Code Online (Sandbox Code Playgroud)
小智 41
如Django Model Field中所述:链接
以下参数可用于所有字段类型.所有都是可选的.
nullField.null如果True,Django将NULL在数据库中存储空值.默认是False.
避免null在基于字符串的字段上使用,例如CharField,TextField因为空字符串值将始终存储为空字符串,而不是NULL.如果基于字符串的字段具有null=True,则表示它具有"无数据"的两个可能值:NULL和空字符串.在大多数情况下,为"无数据"提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL.
对于基于字符串和非基于字符串的字段,您还需要设置blank=True是否允许在表单中允许空值,因为该null参数仅影响数据库存储(请参阅参考资料blank).
注意
使用Oracle数据库后端时,无论此属性如何,都将存储值NULL以表示空字符串
blankField.blank 如果True,该字段允许为空.默认是False.
请注意,这与...不同null.null纯粹与数据库相关,而blank与验证相关.如果字段有blank=True,则表单验证将允许输入空值.如果字段有blank=False,则需要该字段.
Kev*_*nry 32
在查看Django模型定义中的选项时,了解它们(至少)有两个目的是至关重要的:定义数据库表,定义模型表单的默认格式和验证.(我说"默认"是因为可以通过提供自定义表单来覆盖值.)某些选项会影响数据库,某些选项会影响表单,有些选项会影响表单.
当谈到null并且blank,其他答案已经明确表示前者影响数据库表定义,后者影响模型验证.我认为通过查看所有四种可能配置的用例,可以更清楚地区分:
null=False,blank=False:这是默认配置,表示在所有情况下都需要该值.
null=True,blank=True:这意味着该字段在所有情况下都是可选的.(如下所述,这不是建议使基于字符串的字段可选的方法.)
null=False,blank=True:这意味着表单不需要值,但数据库需要.这有很多用例:
此配置的最常见用途是可选的基于字符串的字段.如文档中所述,Django习惯用法是使用空字符串来表示缺失值.如果NULL也允许,最终会有两种不同的方式来表示缺失值.
另一种常见情况是,您希望根据另一个字段的值自动计算一个字段(例如,在您的save()方法中).您不希望用户以表单形式提供值(因此blank=True),但您确实希望数据库强制始终提供值(null=False).
此配置的另一个用途是当您想要指示a ManyToManyField是可选的时.因为此字段是作为单独的表而不是数据库列实现的,null所以没有意义.但是,值blank仍将影响表单,控制在没有关系时验证是否会成功.
null=True,blank=False:这意味着表单需要一个值,但数据库不需要.这可能是最不经常使用的配置,但有一些用例:
Ran*_*u R 24
简单地null=True定义数据库应该接受NULL值,另一方面blank=True定义表单验证这个字段是否应该接受空白值(如果blank=True它接受该字段中没有值的表单和blank=False表单验证时的[默认值]它将显示此字段是必需的错误.
null=True/False 与数据库有关
blank=True/False 与表单验证有关
sar*_*n3h 15
你可能得到了答案,但直到今天很难判断是否将null = True或blank = True或两者都放入一个字段.我个人认为向开发人员提供这么多选项是非常无用和困惑的.让他们想要处理空值或空格.
Str*_*ker 11
这是带有blank= True和的字段的示例null=True
description = models.TextField(blank = True,null = True)
在这种情况下::
blank = True告诉我们的表格可以将描述字段留空
和
null = True:告诉我们的数据库可以在db字段中记录一个空值并且不给出错误。
小智 9
null 和 blank 的默认值为 False。
Null:与数据库相关。定义给定的数据库列是否接受空值。
空白:与验证相关。它将在表单验证期间使用,当调用 form.is_valid() 时。
话虽如此,拥有一个 null=True 和 blank=False 的字段是完全没问题的。这意味着在数据库级别该字段可以为 NULL,但在应用程序级别它是必填字段。
现在,大多数开发人员都弄错了:为基于字符串的字段(例如 CharField 和 TextField)定义 null=True。避免这样做。否则,您最终将有两个可能的“无数据”值,即:无和空字符串。“无数据”有两个可能的值是多余的。Django 约定是使用空字符串,而不是 NULL。
我认为您可能对 将空的可为空的CharField保存为null而不是空字符串感兴趣。关于此的讨论很多,您可能会遇到一个非常实际的问题(例如,您想为每个用户添加一个openid URL,该URL可以为null,并且应该是唯一的)。
null = True
Run Code Online (Sandbox Code Playgroud)
意味着对于要填充的字段没有数据库的约束,因此您可以拥有一个具有空值的对象,该对象具有此选项。
blank = True
Run Code Online (Sandbox Code Playgroud)
意味着没有django形式的验证约束。因此,当您modelForm为此模型填写时,可以不填写此选项。
小智 6
这里,是的主要区别null=True和blank=True:
两者的默认值null和blank值为False。这两个值都在字段级别起作用,即我们是否要保留字段null或blank。
null=True将字段的值设置为NULL即无数据。它基本上是针对数据库列的值。
date = models.DateTimeField(null=True)
Run Code Online (Sandbox Code Playgroud)
blank=True确定是否需要表单中的字段。这包括管理员和您自己的自定义表单。
title = models.CharField(blank=True) // title can be kept blank.
在数据库("")中将被存储。
null=True blank=True这意味着该字段在所有情况下都是可选的。
epic = models.ForeignKey(null=True, blank=True)
// The exception is CharFields() and TextFields(), which in Django are never saved as NULL. Blank values a
Run Code Online (Sandbox Code Playgroud)
小智 6
null = True || blank = True || null = True && blank = Trueclass TestModel(models.Model):
field1 = models.CharField(max_length=100, null=True)
field2 = models.CharField(max_length=100, blank=True) # it's not a correct way
field3 = models.CharField(max_length=100, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
MySQLCREATE TABLE TestModel (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`field1` VARCHAR(100) NULL DEFAULT NULL,
`field2` VARCHAR(100) NOT NULL,
`field3` VARCHAR(100) NULL DEFAULT NULL,
)
Run Code Online (Sandbox Code Playgroud)
null = Truedb: db field is accepts null value
form: form field is `required`
NB: DB IS ACCEPTS NULL VALUE, BUT FORM FIELD IS REQUIRED. SO FORM IS
SUBMITTED WHEN THIS FIELD HAVE SOME VALUE. it's good.
Run Code Online (Sandbox Code Playgroud)
blank = Truedb: db field is not accepts null value
form: form field is `optional`
NB: FORM IS VALID WITHOUT ANY VALUE, BUT DB IS NOT ACCEPTS NULL VALUE.
SO THE FORM IS SUBMITTED WITHOUT ANY VALUE THEN BOOM. it's worst.
Run Code Online (Sandbox Code Playgroud)
null = True && blank = Truedb: db field is accepts null value
form: form field is `optional`
NB: HERE FORM FIELD IS OPTIONAL & FORM IS VALID WITHOUT ANY VALUE
& DB ALSO ACCEPTS NULL VALUE. SO, IT'S BEST TO USE `null=True && blank=True`
Run Code Online (Sandbox Code Playgroud)
当我们在Django admin中保存任何内容时,将在Django级别和数据库级别进行两步验证。我们无法在数字字段中保存文本。
数据库的数据类型为NULL,没什么。当Django在数据库中创建列时,它指定它们不能为空。而且,如果您尝试保存NULL,则会出现数据库错误。
同样在Django-Admin级别,默认情况下所有字段都是必填字段,您无法保存空白字段,Django会抛出错误。
因此,如果要保存空白字段,则需要在Django和数据库级别允许它。blank = True-将允许管理面板中的空字段null = True-将允许将NULL保存到数据库列。
有一点null=True甚至在CharFieldor 上也有必要TextField,那就是数据库unique为该列设置了标志。
换句话说,如果您在Django中具有唯一的Char / TextField,则需要使用以下代码:
models.CharField(blank=True, null=True, unique=True)
Run Code Online (Sandbox Code Playgroud)
对于非唯一的CharField或TextField,最好跳过null=True一些,否则某些字段将被设置为NULL,而另一些字段将被设置为“”,并且您每次都必须检查字段值是否为NULL。
| 归档时间: |
|
| 查看次数: |
220512 次 |
| 最近记录: |