未加星标

Django中null和blank的区别

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二05 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏

Django的Model可以设置字段的null属性和blank属性。

null属性是针对数据库而言的,null=True将设置数据库的COLUMN为NULL(或者NOT NULL),而blank为True将不会影响数据库的结构,依然是必填。但是在Django里面,是可选的。即Form不会是required,Django自带的admin页面不要求必填了。

具体作用到数据库,是这样:

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)

在 PostgreSQL 9.4 的结果如下 :

CREATE TABLE Test ( idserialNOT NULL, "charNull"character varying(10), "charBlank"character varying(10)NOT NULL, "charNullBlank" character varying(10), "intNull"integer, "intBlank"integerNOT NULL, "intNullBlank"integer, "dateNull"timestamp with time zone, "dateBlank"timestamp with time zoneNOT NULL, "dateNullBlank" timestamp with time zone, CONSTRAINT Test_pkey PRIMARY KEY (id) )

mysql 5.6 的结果如下 :

CREATE TABLE Test ( `id`INT(11)NOTNULLAUTO_INCREMENT, `charNull`VARCHAR(10) NULL DEFAULT NULL, `charBlank`VARCHAR(10) NOTNULL, `charNullBlank` VARCHAR(10) NULL DEFAULT NULL, `intNull`INT(11)NULL DEFAULT NULL, `intBlank`INT(11)NOTNULL, `intNullBlank`INT(11)NULL DEFAULT NULL, `dateNull`DATETIMENULL DEFAULT NULL, `dateBlank`DATETIMENOTNULL, `dateNullBlank` DATETIMENULL DEFAULT NULL )

可以看出,数据库的字段是否可以为空完全取决于null属性,和blank没有关系。

那么为什么需要需要两个变量分开呢? 想象这样一种场景:我们需要用户的forms必填某一个选项,但是是否存储到数据库,就取决于其他的一些情况了。再如,我们需要用户必须输入,但是我们用其他方式(除了Django之外,例如用shell维护数据库的时候)时,可以不用设置这些字段,这时候就可以设置null=True,blak=False。

另外要注意的是,有些字段是不适合设置null或blank的,参考下表:

Field 类型 设置null=True 设置blank=True CharField,
TextField,
SlugField,
EmailField,
CommaSeparatedIntegerField等 不要设置
django规定储存空字符串来代表空值, 当从数据库中读取NULL或空值时都为空字符串 可以设置
设置后允许接受widget中为空值(即不填写), 储存到数据库时空值变为空字符串 FileField,
ImageField 不要设置
django实际储存的是路径的字符串, 因此同上 可以设置
同上 BooleanField 不要设置
因为有NullBooleanField代替 不要设置 IntegerField,
FloatField,
DecimalField等 可以设置
如果你希望在数据库中能储存NULL 可以设置
设置后允许接受widget中为空值(即不填写), 设置为True时必须同时设置null=True DateTimeField,
DateField,
TimeField等 可以设置
如果你希望在数据库中能储存NULL 可以设置
设置后允许接受widget中为空值(即不填写), 设置为True时必须同时设置null=True ForeignKey,
ManyToManyField,
OneToOneField 可以设置
如果你希望在数据库中能储存NULL 可以设置
设置后允许接受widget中为空值(即不填写) GenericIPAddressField 可以设置
如果你希望在数据库中能储存NULL 可以设置
设置后允许接受widget中为空值(即不填写) IPAddressField 不推荐设置
用GenericIPAddressField代替 不推荐设置
用GenericIPAddressField代替

参考资料:

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

主题: Django数据SQLAUMySQLPostgreSQL数据库TIUTAUT
分页:12
转载请注明
本文标题:Django中null和blank的区别
本站链接:http://www.codesec.net/view/520918.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(106)