.jpg)
当我们在 Django 中添加模型字段时,我们通常这样写:
models.CharField(max_length=100, null=True, blank=True)
对 等也是如此。两者之间的基本区别是什么:ForeignKeyDecimalField
null=True只blank=True只null=True和blank=True关于不同的(、、、)字段?使用选项 1、2 或 3 的优点/缺点是什么?CharFieldForeignKeyManyToManyFieldDateTimeField

网友回答:
这就是 Django 1.8 的 ORM 映射和字段的方式。blanknull
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 (
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)
)
为 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
)

网友回答:
null=True在数据库中的列上设置(与 )。Django 字段类型(如 或)的空白值将存储在数据库中。NULLNOT NULLDateTimeFieldForeignKeyNULL
blank确定表单中是否需要该字段。这包括管理员和您的自定义表单。如果,则该字段将不是必需的,而如果是,则该字段不能为空。blank=TrueFalse
两者的组合非常频繁,因为通常,如果您要允许表单中的字段为空,则还需要数据库允许该字段的值。例外是 s 和 s,它们在 Django 中永远不会保存为 .空白值作为空字符串 () 存储在数据库中。NULLCharFieldTextFieldNULL''
举几个例子:
models.DateTimeField(blank=True) # raises IntegrityError if blank
models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form
显然,这两个选项在逻辑上没有意义(尽管如果您希望表单中始终需要字段,则可能存在一个用例,在通过类似shell之类的东西处理对象时是可选的。null=True, blank=False
models.CharField(blank=True) # No problem, blank is stored as ''
models.CharField(null=True) # NULL allowed, but will never be set as NULL
CHAR并且类型永远不会像 Django 那样保存,所以是不必要的。但是,您可以手动将这些字段之一设置为 以强制将其设置为 。如果某个方案可能需要这样做,则仍应包括 。TEXTNULLnull=TrueNoneNULLnull=True

网友回答:
理解 Django 模型字段定义中的选项(至少)有两个目的是至关重要的:定义数据库表,以及定义模型表单的默认格式和验证。(我说“默认”是因为始终可以通过提供自定义表单来覆盖这些值。有些选项会影响数据库,有些选项会影响表单,有些选项会影响两者。
当涉及到和时,其他答案已经清楚地表明,前者影响数据库表定义,后者影响模型验证。我认为通过查看所有四种可能配置的用例,可以更清楚地区分:nullblank
null=False, :这是默认配置,表示在所有情况下都需要该值。blank=Falsenull=True, :这意味着该字段在所有情况下都是可选的。但是,如下所述,这不是使基于字符串的字段成为可选字段的推荐方法。blank=Truenull=False, :这意味着表单不需要值,但数据库需要。这有许多用例:blank=True
NULLuniquenull=Truesave()blank=Truenull=FalseManyToManyFieldnullblanknull=True, :这意味着表单需要一个值,但数据库不需要。这可能是最不常用的配置,但有一些用例:blank=False
ForeignKeyblank=Falsenull=Trueon_delete=models.SET_NULL模板简介:该模板名称为【在 Django 中 null=True 和 blank=True 有什么区别?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。