python - true - django textarea field




在django中區分null=True,blank=True (6)

當我們在django中添加數據庫字段時,我們通常會編寫models.CharField(max_length=100, null=True, blank=True) 。 對於ForeignKeyDecimalField等也是這樣做的。具有什麼基本差異

  1. null=True僅為null=True
  2. blank=True僅為blank=True
  3. null=Trueblank=True

關於不同的( CharFieldForeignKeyManyToManyFieldDateTimeField )字段。 使用1/2/3有什麼優點/缺點?


null用於DataBase列值

null=True在數據庫中的列上設置NULL (與NOT NULL )。 Django字段類型(如DateTimeFieldForeignKey空值將在數據庫中存儲為NULL

blank是表格中的字段要求

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 ,但是通過某些東西來處理一個對象時可選像殼一樣)。

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


在查看Django模型定義中的選項時,至關重要的一點是它們至少有兩個目的:定義數據庫表,定義默認格式和驗證模型表單。 (我說“默認”是因為可以通過提供自定義表單來覆蓋這些值。)一些選項影響數據庫,一些選項影響表單,一些影響兩者。

當涉及到blank ,其他答案已經清楚地表明前者影響數據庫表定義,而後者影響模型驗證。 我認為通過查看所有四種可能配置的用例,可以更清楚地區分這種區別:

  • null=Falseblank=False :這是默認配置,意味著該值在所有情況下都是必需的。

  • null=Trueblank=True :這意味著該字段在任何情況下都是可選的。 (如下所述,雖然這不是推薦的基於字符串的字段的可選方法。)

  • null=Falseblank=True :這意味著表單不需要值,但是數據庫可以。 這有很多用例:

    • 此配置最常用的用途是可選的基於字符串的字段。 如文檔中所述 ,Django習慣用法是使用空字符串來表示缺少的值。 如果NULL也被允許,你最終會用兩種不同的方式來表示一個缺失的值,這將是不理想的。

    • 另一種常見的情況是,你想根據另一個字段的值自動計算一個字段save()比如在你的save()方法中)。 您不希望用戶在表單中提供值(因此為blank=True ),但您希望數據庫強制始終提供值( null=False )。

    • 此配置的另一個用途是當您要指示ManyToManyField是可選的時。 由於該字段是作為單獨的表而不是數據庫列實現的,因此null是毫無意義的 。 然而, blank值仍然會影響表單,控制在沒有關係時驗證是否成功。

  • null=Trueblank=False :這意味著表單需要一個值,但數據庫不需要。 這可能是最不經常使用的配置,但有一些用例:

    • 即使您的業務邏輯沒有真正需要您的用戶,也始終要包含一個值,這是完全合理的。 畢竟,表單只是添加和編輯數據的一種方式。 您可能擁有生成數據的代碼,這些數據不需要您想要人工編輯器進行的嚴格驗證。

    • 我見過的另一個用例是當你有一個你不希望級聯刪除ForeignKey時。 也就是說,在正常使用中,關係應始終在那裡( blank=False ),但如果它指向的東西恰好被刪除,則不希望此對像也被刪除。 在這種情況下,您可以使用null=Trueon_delete=models.SET_NULL來實現一種簡單的軟刪除


正如在Django Model Field中所說的: Link

字段選項

以下參數適用於所有字段類型。 全部都是可選的。


null

Field.null

如果為True ,Django將在數據庫中將空值存儲為NULL 。 默認值是False

避免在基於字符串的字段(如CharFieldTextField上使用null ,因為空字符串值將始終作為空字符串存儲,而不是NULL 。 如果一個基於字符串的字段具有null=True ,那意味著它有兩個可能的值:“無數據”: NULL和空字符串。 在大多數情況下,“無數據”有兩個可能的值是多餘的; Django約定是使用空字符串,而不是NULL

對於基於字符串和非基於字符串的字段,如果您希望允許表單中的空值,則還需要設置blank=True ,因為null參數僅影響數據庫存儲(請參見blank )。

注意

在使用Oracle數據庫後端時,無論此屬性如何,都將存儲NULL值以表示空字符串


blank

Field.blank

如果為True ,則允許該字段為空。 默認值是False

請注意,這與null不同。 null與純數據庫相關,而blank與驗證相關。 如果一個字段的值為空,則表單驗證將允許輸入一個空值。 如果一個字段有blank=False ,則該字段將是必需的。


當我們在Django admin中保存任何內容時,會在Django級別和數據庫級別進行驗證。 我們無法將文本保存在數字字段中。

數據庫有數據類型NULL,它什麼也沒有。 當Django在數據庫中創建列時,它指定它們不能為空。 如果你會嘗試保存NULL,你會得到數據庫錯誤。

同樣在Django-Admin級別,所有的字段默認都是必需的,你不能保存空白字段,Django會給你一個錯誤。

所以,如果你想保存空白字段,你需要在Django和數據庫級別允許它。 blank = True - 將允許管理面板中的空字段null = True - 將允許將NULL保存到數據庫列。


這是ORM如何為Django 1.8映射blank字段

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
)

這裡是一個空白= true和null = true的字段示例description = models.TextField(blank = True,null = True)

在這種情況下:blank = True:告訴我們的表單可以將描述字段留空

null = True:告訴我們的數據庫可以在我們的db字段中記錄一個空值並且不會給出錯誤。







django-models