Django模型字段選項詳解

字段選項(Field options)

下列參數是所有字段類型均可用的,並且都是可選擇的。html

null

Field.nullsql

若是爲True,Django 將空值以NULL 存儲到數據庫中。默認值是 False。數據庫

字符串字段例如CharField 和TextField 要避免使用null,由於空字符串值將始終儲存爲空字符串而不是NULL。若是字符串字段的null=True,那意味着對於「無數據」有兩個可能的值:NULL 和空字符串。在大多數狀況下,對於「無數據」聲明兩個值是贅餘的,Django 的慣例是使用空字符串而不是NULL。django

不管是字符串字段仍是非字符串字段,若是你但願在表單中容許空值,你將還須要設置blank=True,由於null 僅僅影響數據庫存儲。ide

注意函數

在使用Oracle 數據庫時,數據庫將存儲NULL 來表示空字符串,而與這個屬性無關。spa

若是你但願BooleanField 接受null 值,請用 NullBooleanField 代替。orm

blank

Field.blankhtm

若是爲True,則該字段容許爲空白。 默認值是 False。對象

注意它與null不一樣。null 純粹是數據庫範疇的概念,而blank 是數據驗證範疇的。若是字段設置blank=True,表單驗證時將容許輸入空值。若是字段設置blank=False,則該字段爲必填。

choices

Field.choices

它是一個可迭代的結構(好比,列表或是元組),由可迭代的二元組組成(好比[(A, B), (A, B) ...]),用來給這個字段提供選擇項。若是設置了 choices ,默認表格樣式就會顯示選擇框,而不是標準的文本框,並且這個選擇框的選項就是 choices 中的元組。

每一個元組中的第一個元素,是存儲在數據庫中的值;第二個元素是該選項更易理解的描述。 好比:

YEAR_IN_SCHOOL_CHOICES = (
    ('FR', 'Freshman'),
    ('SO', 'Sophomore'),
    ('JR', 'Junior'),
    ('SR', 'Senior'),
)

通常來講,最好在模型類內部定義choices,而後再給每一個值定義一個合適名字的常量。

from django.db import models

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    YEAR_IN_SCHOOL_CHOICES = (
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
    )
    year_in_school = models.CharField(max_length=2,
                                      choices=YEAR_IN_SCHOOL_CHOICES,
                                      default=FRESHMAN)

    def is_upperclass(self):
        return self.year_in_school in (self.JUNIOR, self.SENIOR)

儘管你能夠在模型類的外部定義choices而後引用它,可是在模型類中定義choices和其每一個choice的name(即元組的第二個元素)能夠保存全部使用choices的類的信息, 也使得choices更容易被應用(例如, Student.SOPHOMORE 能夠在任何引入Student 模型的位置生效)。

你也能夠歸類可選的choices到已命名的組中用來達成組織整理的目的:

MEDIA_CHOICES = (
    ('Audio', (
            ('vinyl', 'Vinyl'),
            ('cd', 'CD'),
        )
    ),
    ('Video', (
            ('vhs', 'VHS Tape'),
            ('dvd', 'DVD'),
        )
    ),
    ('unknown', 'Unknown'),
)

每一個元組的第一個元素是組的名字。第二個元素是一組可迭代的二元元組,每個二元元組包含一個值和一個給人看的名字構成一個選項。分組的選項可能會和未分組的選項合在同一個list中。 (就像例中的unknown選項)。

對於有choices set的模型字段, Django 將會加入一個方法來獲取當前字段值的易於理解的名稱(即元組的第二個值)參見數據庫API文檔中的get_FOO_display()。

請注意choices能夠是任何可迭代的對象 – 不是必須是列表或者元組。這一點使你能夠動態的構建choices。可是若是你發現你本身搞不定動態的choices,你最好仍是使用ForeignKey來構建一個合適的數據庫表。若是有數據變更的話,choices意味着那些變更很少的靜態數據。

New in Django 1.7.

除非blank=False 和default一塊兒在字段中被設置,不然,可選擇菜單將會有"---------" 的標籤。要重寫這個行爲, 須要加入一個包含None的元組到 choices裏面; 例如 (None, 'Your String For Display'). 或者, 你能夠在操做有意義的地方用一個空字符串代替None  - 好比在一個 CharField.

db_column

Field.db_column

數據庫中用來表示該字段的名稱。若是未指定,那麼Django將會使用Field名做爲字段名.

若是你的數據庫列名爲SQL語句的保留字,或者是包含不能做爲Python 變量名的字符,如連字符,沒問題。Django 會在後臺給列名和表名加上雙引號。

db_index

Field.db_index

若值爲 True, 則 django-admin sqlindexes 將會爲此字段輸出 CREATE INDEX 語句。(譯註:爲此字段建立索引)

db_tablespace

Field.db_tablespace

 若是該字段有索引的話,database tablespace的名稱將做爲該字段的索引名。 若是DEFAULT_INDEX_TABLESPACE 已經設置,則默認值是由DEFAULT_INDEX_TABLESPACE指定, 若是沒有設置則由 db_tablespace 指定,若是後臺數據庫不支持表空間,或者索引,則該選項被忽略

default

Field.default

該字段的默認值. 它能夠是一個值或者一個可調用對象. 若是是一個可調用對象,那麼在每一次建立新對象的時候,它將會調用一次.

這個默認值不能夠是一個可變對象(如字典,列表,等等),由於對於全部模型的一個新的實例來講,它們指向同一個引用。或者,把他們包裝爲一個可調用的對象。例如,你有一個自定義的JSONField,而且想指定一個特定的字典值,能夠以下使用:

def contact_default():
    return {"email": "to1@example.com"}

contact_info = JSONField("ContactInfo", default=contact_default)

請注意lambdas 函數不可做爲如 default 這類可選參數的值.由於它們沒法被 migrations命令序列化. 請參見文檔其餘部分。

默認值會在新實例建立而且沒有給該字段提供值時使用。若是字段爲主鍵,默認值也會在設置爲None時使用。

Changed in Django 1.8:

以前的版本不會使用None做爲主鍵 

editable

Field.editable

若是設爲False, 這個字段將不會出如今 admin 或者其餘 ModelForm. 他們也會跳過 模型驗證. 默認是True.

error_messages

Field.error_messages

error_messages 參數可以讓你重寫默認拋出的錯誤信息。經過指定 key 來確認你要重寫的錯誤信息。

error_messages 的 key 值包括 null, blank, invalid, invalid_choice, unique, 和 unique_for_date. 其他的 error_messages 的 keys 是不同的在不一樣的章節下 Field types 。

New in Django 1.7.

這個 unique_for_date 的 error_messages 的key 是在 1.7 中加的。

help_text

Field.help_text

額外的 ‘help' 文本將被顯示在表單控件form中。即使你的字段沒有應用到一個form裏面,這樣的操做對文檔化也頗有幫助。

注意這  會自動添加 HTML 標籤。須要你在 help_text 包含本身須要的格式。例如:

help_text="Please use the following format: <em>YYYY-MM-DD</em>."

另外, 你可使用簡單文本和django.utils.html.escape()以免任何HTML特定的字符.請確保你所使用的help text可以避免那些由不受信任的用戶進行的跨站點腳本攻擊。

primary_key

Field.primary_key

若爲 True, 則該字段會成爲模型的主鍵字段。

若是你沒有在模型的任何字段上指定 primary_key=True, Django會自動添加一個 AutoField 字段來充當主鍵。 因此除非你想要覆蓋默認的主鍵行爲,不然不須要在任何字段上設定primary_key=True 。

primary_key=True 暗含着null=False 和unique=True. 一個對象上只能擁有一個主鍵.

主鍵字段是隻讀的。若是你改變了一個已存在對象上的主鍵而且保存的話,會建立一個新的對象,而不是覆蓋舊的.

unique

Field.unique

若是爲 True, 這個字段在表中必須有惟一值.

這是一個在數據庫級別的強制性動做,而且經過模型來驗證。若是你試圖用一個重複的值來保存unique 字段,那麼一個django.db.IntegrityError就會經過模型的save() 函數拋出來。

除了ManyToManyField、OneToOneField和FileField 之外的其餘字段類型均可以使用這個設置。

注意當設置unique 爲True 時,你不須要再指定 db_index,由於unique 自己就意味着一個索引的建立。

unique_for_date

Field.unique_for_date

當設置它爲DateField 和DateTimeField 字段的名稱時,表示要求該字段對於相應的日期字段值是惟一的。

例如,你有一個title 字段設置unique_for_date="pub_date",那麼Django 將不容許兩個記錄具備相同的title 和pub_date。

注意,若是你將它設置爲DateTimeField,只會考慮其日期部分。此外,若是USE_TZ 爲True,檢查將以對象保存時的當前的時區 進行。

這是在模型驗證期間經過Model.validate_unique() 強制執行的,而不是在數據庫層級進行驗證。若是unique_for_date 約束涉及的字段不是ModelForm中的字段(例如,exclude中列出的字段或者設置了editable=False),Model.validate_unique() 將忽略該特殊的約束。

unique_for_month

Field.unique_for_month

相似unique_for_date,只是要求字段對於月份是惟一的。

unique_for_year

Field.unique_for_year

相似unique_for_date 和 unique_for_month。

verbose_name

Field.verbose_name

一個字段的可讀性更高的名稱。若是用戶沒有設定冗餘名稱字段,Django會自動將該字段屬性名中的下劃線轉換爲空格,並用它來建立冗餘名稱。

validators

Field.validators

該字段將要運行的一個Validator 的列表。

相關文章
相關標籤/搜索