Meta
選項本文介紹你能在model中使用的 class Meta
內嵌類的全部 元數據選項 (meta options)html
Meta
選項abstract
Options.
abstract
若是 abstract = True
,這個 model 就是一個 抽象基類 。mysql
app_label
Options.
app_label
若是一個 model 定義在默認的 models.py
以外 (例如,若是你的 app 的 models 在 myapp.models
子模塊下),你必須定義 app_label 讓 Django 知道它屬於哪個 appsql
app_label = 'myapp'
db_table
Options.
db_table
定義該 model 在數據中的表名稱:數據庫
db_table = 'music_album'
爲了節省時間,Django 會自動的使用你的 model class 的名稱和包含這個 model 的 app 名稱來構建 數據庫的表名稱。一個 model 的數據庫表名稱是經過將 「app label」 – 你在 manage.py startapp
中使用的名稱 – 和 model 的類名稱,加上一個下劃線在他們之間來構成。django
例如,若是你有一個 app 叫作 bookstore
(使用 manage.py startapp bookstore
建立),以 及一個 model 定義爲 class Book
這樣將會建立一個名爲 bookstore_book
的數據庫表。app
若是想自定義數據庫的表名稱,須要在 class Meta
使用 db_table
參數來自定義。ide
若是你的數據庫表名稱是一個SQL保留字,或者它包含不容許出如今 Python 變量中的字符 (好比連字 符)這是沒問題的。這是由於 Django 會自動給列名和表名添加引號。post
在 MySQL 中使用小寫字母做爲數據庫表名稱測試
強烈建議你在經過 db_table
重載數據庫表名稱時,使用小寫字母,特別是當你在使用 MySQL 做爲後臺數據庫時。查看 MySQL notes 瞭解更多細節。ui
db_tablespace
Options.
db_tablespace
定義這個 model 所使用的 數據庫 表空間 。若是在項目的 setting 中定義了 DEFAULT_TABLESPACE
那麼它會使用這個值。若是後臺數據庫不支持 表空間,這個選項會被忽略。
get_latest_by
Options.
get_latest_by
在 model 中指定一個 DateField
或者 DateTimeField
。這個設置讓你在使用 model 的 Manager
上的 latest
方法時,默認使用指定字段來排序。
例如:
get_latest_by = "order_date"
詳見 latest()
。
managed
Options.
managed
默認值爲 True
,這意味着 Django 可使用 syncdb
和 reset
命令 來建立或移除對應的數據庫。換句話說, Django 管理 了數據庫的生命週期。
若是設置爲 False
,Django 將不會爲當前 model 建立或者刪除數據庫表。 一般在表示某個 經過其餘方法建立的現有數據表時這會很是有用。這是當 managed=False
時 僅有 的不一樣之 處。model 在處理全部其餘方面的事情時是徹底一致的。這包括
若是沒有聲明主鍵字段,Django 將自動的爲 model 增長一個自增的主鍵字段。當你使用不被* 管理* 的 models 時,爲了不讓未來閱讀代碼的人迷惑,建議指明全部全部託管在 model 中的字 段與數據庫表的關係。
若是兩個非託管的 models (managed=False
) 之間,使用了 ManyToManyField
關聯,就不會建立多對多關係的中間表。然而 若是是一個託管的 model 與另外一個非託管的 model 的話,多對多關係 將會 被建立。
若是你須要改變默認的行爲,就的顯示的定義中間 model 來在數據庫中建立中間表(要將 managed
設置爲 True
),而後在你的原 model 上使用 ManyToManyField.through
屬性指向中間 model,就能實現自定義的多對多關係。
若是你的測試中包含非託管 model (managed=False
),那麼在測試以前,你應該要確保在測試 建立時已經建立了正確的數據表。
若是你想更改 model 類中某個 Python 層級的行爲,你 能夠 令 managed=False
,而後創 建該 model 的拷貝,在拷貝中定義新的行爲。不過在面對這種狀況時還有個更好的辦法就是使 用 Proxy models 。
order_with_respect_to
Options.
order_with_respect_to
根據給定的字段對 model 排序。在關聯關係中,它常常用在根據目標對象對源對象排序的場合。舉 個例子,一個 Answer
只關聯一個 Question
對象,而一個 question 對象卻能夠關聯多 個 answer 對象。根據 question 對 answer 排序,你應該這麼作:
class Answer(models.Model): question = models.ForeignKey(Question) # ... class Meta: order_with_respect_to = 'question'
當 order_with_respect_to
被設置時,會提供兩個附加的方法用於獲取和設置關聯對象的排序:get_RELATED_order()
和 set_RELATED_order()
,這其中的 RELATED
是 model 的小 寫名字。例如,假定一個 Question
對象關聯到多個 Answer
對象,這將返回一個包含 Answer
對象主鍵的列表:
>>> question = Question.objects.get(id=1) >>> question.get_answer_order() [1, 2, 3]
能夠經過傳入一個 Answer
主鍵的列表的方式來設置 Question
對象關聯的 Answer
對象的順序:
>>> question.set_answer_order([3, 1, 2])
關聯的對象一樣有兩個方法, get_next_in_order()
和 get_previous_in_order()
, 可 以用來訪問那些特定的對象。假定 Answer
對象是以 id
排序的:
>>> answer = Answer.objects.get(id=2) >>> answer.get_next_in_order() <Answer: 3> >>> answer.get_previous_in_order() <Answer: 1>
改變 order_with_respect_to 時注意
order_with_respect_to
增長了一個名爲 _order
的字段(數據庫字段),所以在你進 行 syncdb
操做後,若是你增長或者改變了 order_with_respect_to
請確保 處理得當。
ordering
Options.
ordering
定義了當獲取對象的列表時,對象的默認排序:
ordering = ['-order_date']
這是一個字符串的元組或列表。沒一個字符串都是由一個字段名和一個可選的代表降序的 「-」 前綴構成。 當字段名前面沒有 「-」 時,將默認使用升序排列。使用 」?」 將會隨機排列。
例如,以 pub_date
字段升序排序,可用:
ordering = ['pub_date']
以 pub_date
降序排列時,可用:
ordering = ['-pub_date']
以 pub_date
降序排列,而後再以 author
升序排列,可用:
ordering = ['-pub_date', 'author']
permissions
Options.
permissions
在建立對象時,添加到權限表當中的附加權限信息。Django 自動爲每一個設置了 admin
的對象建立了添 加,刪除和修改的權限。下面這個例子展現瞭如何添加一個附加的權限 can_deliver_pizzas
:
permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)
該項能夠是一個列表或一個由兩個元組構成的元組,以這樣的格式 (permission_code, human_readable_permission_name)
。
proxy
Options.
proxy
若是 proxy = True
,表示該 model 是其父類的代理 model proxy model 。
unique_together
Options.
unique_together
用來設置的不重複的字段組合,必須惟一(將兩個字段作聯合惟一):
unique_together = (("driver", "restaurant"),)
它是一個字段名稱的列表,列表內的字段組合在數據庫中是惟一,不重複的,也就是說不能夠有兩 個對象,它們在列表中的字段值是徹底相同的。它被用在 Django admin 後臺,在數據庫層級約束 數據。(好比,在 CREATE TABLE
語句中包含 UNIQUE
關鍵字)
爲了使用方便,你能夠賦給該項一個單獨的字段列表的元組:
unique_together = ("driver", "restaurant")
一個 ManyToManyField
不能包含在 unique_together
中。 (這 將會致使它看起來不明不白!) 若是你須要驗證關聯到ManyToManyField
字段的惟一性驗證,嘗試使用 signal(信號) 或者 明確指定 model 的 through
屬性。
verbose_name
Options.
verbose_name
指明一個易於理解和表述的對象名稱,單數形式:
verbose_name = "pizza"
若是這個值沒有設置, Django 將會使用該 model 的類名的分詞形式做爲他的對象表述名: CamelCase
將會轉換爲 camel case
。
verbose_name_plural
Options.
verbose_name_plural
對象的複數表述名:
verbose_name_plural = "stories"
若是沒有指定,Django 會使用 verbose_name
+ "s"
的形式做爲對象的表述名。