模型的Meta選項 本文闡述所有可用的元數據選項,你可以在模型的Meta類中設置他們 Meta選項 abstract 如果為True,就表示抽象基類 app_label 如果模型在INSTALLED_APPS之外被定義,則必須通過app_label聲明它屬於哪個app db_table 該模型所用數 ...
模型的Meta選項
本文闡述所有可用的元數據選項,你可以在模型的Meta類中設置他們
Meta選項
abstract
如果為True,就表示抽象基類
app_label
如果模型在INSTALLED_APPS之外被定義,則必須通過app_label聲明它屬於哪個app
db_table
該模型所用數據表的名稱。Django預設使用你的 model class 的名稱和包含這個 model 的 app 名稱來構建 資料庫的表名稱。
db_tablespace
表空間名字。預設值是項目設置中的DEFAULT_TABLESPACE
default_related_name
關聯對象反向查找源對象時用到的名稱,預設為<model_name>_set。也可以直接模型類中定義一個related_name來覆蓋預設值
get_latest_by
Django管理器給我們提供有latest()和earliest()方法,分別表示獲取最近一個和最前一個數據對象。但是,如何來判斷最近一個和最前面一個呢?也就是根據什麼來排序呢?get_latest_by
元數據選項幫你解決這個問題,它可以指定一個類似 DateField
、DateTimeField
或者IntegerField
這種可以排序的欄位,作為latest()和earliest()方法的排序依據,從而得出最近一個或最前面一個對象。
managed
該元數據預設值為True,表示Django將按照既定的規則,管理資料庫表的生命周期。如果設置為False,將不會針對當前模型創建和刪除資料庫表。在某些場景下,這可能有用,但更多時候,你可以忘記該選項。
ordering
對象的排列順序,在獲取對象的列表時使用
它是一個字元串的列表或元組。 每個字元串是一個欄位名,前面帶有可選的“-”首碼表示倒序。 前面沒有“-”的欄位表示正序。 使用字元串“?”來隨機排序。
permissions
用於當創建對象時增加額外的許可權,Django會為每個模型自動創建,增刪該3個許可權,它是一個包含二元組的元組或者列表,格式為 (permission_code, human_readable_permission_name)
。
permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)
default_permissions
Django預設給所有的模型設置('add', 'change', 'delete')的許可權,也就是增刪改。你可以自定義這個選項,比如設置為一個空列表,表示你不需要預設的許可權,但是這一操作必須在執行migrate命令之前。
proxy
如果設置了proxy = True
,表示使用代理模式的模型繼承方式。具體內容與abstract選項一樣
required_db_features
聲明模型依賴的資料庫功能。比如['gis_enabled'],表示模型的建立依賴GIS功能。
required_db_vendor
聲明模型支持的資料庫。Django預設支持sqlite, postgresql, mysql, oracle
select_on_save
決定是否使用1.6版本之前的django.db.models.Model.save()
演算法保存對象。預設值為False。這個選項我們通常不用關心。
indexes
要在模型上定義的索引的列表:
from django.db import models class Customer(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) class Meta: indexes = [ models.Index(fields=['last_name', 'first_name']), models.Index(fields=['first_name'], name='first_name_idx'), ]
unique_together
用來設置的不重覆的欄位組合,它是一個元組的元組,組合起來的時候必須是唯一的。
這個元數據是非常重要的一個!它等同於資料庫的聯合約束!
舉個例子,假設有一張用戶表,保存有用戶的姓名、出生日期、性別和籍貫等等信息。要求是所有的用戶唯一不重覆,可現在有好幾個叫“張偉”的,如何區別它們呢?(不要和我說主鍵唯一,這裡討論的不是這個問題)
我們可以設置不能有兩個用戶在同一個地方同一時刻出生並且都叫“張偉”,使用這種聯合約束,保證資料庫能不能重覆添加用戶(也不要和我談小概率問題)。在Django的模型中,如何實現這種約束呢?
使用unique_together
,也就是聯合唯一!
比如:
unique_together = (('name', 'birth_day', 'address'),)
這樣,哪怕有兩個在同一天出生的張偉,但他們的籍貫不同,也就是兩個不同的用戶。一旦三者都相同,則會被Django拒絕創建。這一元數據經常被用在admin後臺,並且強制應用於資料庫層面。
unique_together接收一個二維的元組((xx,xx,xx,...),(),(),()...),每一個元素都是一個元組,表示一組聯合唯一約束,可以同時設置多組約束。為了方便,對於只有一組約束的情況下,可以簡單地使用一維元素,例如:
unique_together = ('name', 'birth_day', 'address')
聯合唯一約束無法作用於普通的多對多欄位。
verbose_name
用於設置模型對象的直觀、人類可讀的名稱。可以用中文
如果此項沒有設置,Django會把類名拆分開來作為自述名,比如CamelCase
會變成camel case
verbose_name_plural
模型對象的複數名,比如“apples”。因為我們中文通常不區分單複數,所以保持和verbose_name
一致也可以
如果此項沒有設置,Django 會使用 verbose_name
+ "s"
。
只讀的Meta屬性
label
對象的表示,返回app_label.object_name
,例如'polls.Question'
。
label_lower
模型的表示,返回app_label.model_name
,例如'polls.question'
。