zoukankan      html  css  js  c++  java
  • Django中blank和NULL

    当我们在django中添加一个数据库字段时,我们通常会写models.CharField(max_length = 100,null = True,blank = True)。用ForeignKeyDecimalField做同样的事情。有什么基本的区别在于

    • null = True only
    • blank = True only
    • null = Trueblank = True
      关于不同的(CharFieldForeignKeyManyToManyFieldDateTimeField)字段。使用1/2/3有什么优点/缺点?

    在数据库中的列上设置NULL(而不是NOT NULL)。 Django字段类型(如DateTimeFieldForeignKey)的空值将作为NULL存储在DB中。

    blank = True决定了表单中是否需要该字段。这包括管理员和您自己的自定义表单。如果blank = True那么这个字段不是必需的,而如果是False,那么这个字段不能是空白的。

    这两者的组合非常频繁,因为通常情况下,如果您要允许表单中的某个字段为空,则还需要您的数据库允许NULL值该领域。例外是CharFieldTextField,它们在Django中永远不会保存为NULL。空值作为空字符串存储在数据库中(')。

    几个例子:

    models.DateTimeField(blank=True) # raises IntegrityError if blank
    
    models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form
    

    很明显,这两个选项并不合逻辑,但是如果你希望在表单中总是需要一个字段的话,那么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
    

    CHARTEXT类型从来不会被Django保存为NULL,所以null = True是不必要的。但是,您可以手动将其中一个字段设置为None,以强制将其设置为NULL。如果您有可能需要的场景,您仍然应该包含null = True

    这是ORM如何映射blank& Django 1.8的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)        
    

    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
    )
    
  • 相关阅读:
    db2中的常用命令及使用方法
    互联网服务应用协议设计
    Zookeeper整理(一)- 写操作产生事件,写操作与Watcher对应关系
    实现自己的连接池(一)
    SMP、NUMA、MPP体系结构介绍
    随手备忘 ubuntu12.04 lts 安装gcc 4.8
    认真体会 结构体中的零长度数组
    由内存池实现总结内存对齐问题
    认真理解 oom killer 备忘
    仔细体会 epoll中的et lt模式
  • 原文地址:https://www.cnblogs.com/kolane/p/11537918.html
Copyright © 2011-2022 走看看