Django model中的 class Meta 詳解
通過一個內嵌類 “class Meta” 給你的 model 定義元資料, 類似下面這樣:
class Foo(models.Model):
bar = models.CharField(maxlength=30)
class Meta:
# ...
Model 元資料就是 “不是一個欄位的任何資料” – 比如排序選項, admin 選項等等.
下面是所有可能用到的 Meta 選項. 沒有一個選項是必需的. 是否新增 class Meta 到你的 model 完全是可選的.
app_label
app_label這個選項只在一種情況下使用,就是你的模型類不在預設的應用程式包下的models.py檔案中,這時候你需要指定你這個模型類是那個應用程式的。比如你在其他地方寫了一個模型類,而這個模型類是屬於myapp的,那麼你這是需要指定為:
app_label=‘myapp’
db_table
db_table是用於指定自定義資料庫表名的。Django有一套預設的按照一定規則生成資料模型對應的資料庫表名,如果你想使用自定義的表名,就通過這個屬性指定,比如:
table_name=‘my_owner_table’
若不提供該引數, Django 會使用 app_label + ‘_’ + module_name 作為表的名字.
若你的表的名字是一個 SQL 保留字, 或包含 Python 變數名不允許的字元–特別是連字元 --沒關係. Django 會自動在幕後替你將列名字和表名字用引號引起來.
db_tablespace
有些資料庫有資料庫表空間,比如Oracle。你可以通過db_tablespace來指定這個模型對應的資料庫表放在哪個資料庫表空間。
get_latest_by
由於Django的管理方法中有個lastest()方法,就是得到最近一行記錄。如果你的資料模型中有 DateField 或 DateTimeField 型別的欄位,你可以通過這個選項來指定lastest()是按照哪個欄位進行選取的。
一個 DateField 或 DateTimeField 欄位的名字. 若提供該選項, 該模組將擁有一個 get_latest() 函式以得到 “最新的” 物件(依據那個欄位):
get_latest_by = “order_date”
managed
由於Django會自動根據模型類生成對映的資料庫表,如果你不希望Django這麼做,可以把managed的值設定為False。
預設值為True,這個選項為True時Django可以對資料庫表進行 migrate或migrations、刪除等操作。在這個時間Django將管理資料庫中表的生命週期
如果為False的時候,不會對資料庫表進行建立、刪除等操作。可以用於現有表、資料庫檢視等,其他操作是一樣的。
order_with_respect_to
這個選項一般用於多對多的關係中,它指向一個關聯物件。就是說關聯物件找到這個物件後它是經過排序的。指定這個屬性後你會得到一個get_XXX_order()和set_XXX_order()的方法,通過它們你可以設定或者回去排序的物件。
舉例來說, 如果一個 PizzaToppping 關聯到一個 Pizza 物件, 這樣做:
order_with_respect_to = ‘pizza’
…就允許 toppings 依照相關的 pizza 來排序.
ordering
這個欄位是告訴Django模型物件返回的記錄結果集是按照哪個欄位排序的。比如下面的程式碼:
ordering=[‘order_date’]
按訂單升序排列
ordering=[’-order_date’]
按訂單降序排列,-表示降序
ordering=[’?order_date’]
隨機排序,?表示隨機
ordering = [’-pub_date’, ‘author’]
對 pub_date 降序,然後對 author 升序
需要注意的是:不論你使用了多少個欄位排序, admin 只使用第一個欄位
permissions
permissions主要是為了在Django Admin管理模組下使用的,如果你設定了這個屬性可以讓指定的方法許可權描述更清晰可讀。
要建立一個物件所需要的額外的許可權. 如果一個物件有 admin 設定, 則每個物件的新增,刪除和改變許可權會人(依據該選項)自動建立.下面這個例子指定了一個附加許可權: can_deliver_pizzas:
permissions = ((“can_deliver_pizzas”, “Can deliver pizzas”),)
這是一個2-元素 tuple 的tuple或列表, 其中兩2-元素 tuple 的格式為:(permission_code, human_readable_permission_name).
unique_together
unique_together這個選項用於:當你需要通過兩個欄位保持唯一性時使用。這會在 Django admin 層和資料庫層同時做出限制(也就是相關的 UNIQUE 語句會被包括在 CREATE TABLE 語句中)。比如:一個Person的FirstName和LastName兩者的組合必須是唯一的,那麼需要這樣設定:
unique_together = ((“first_name”, “last_name”),)
verbose_name
verbose_name的意思很簡單,就是給你的模型類起一個更可讀的名字:
verbose_name = “pizza”
若未提供該選項, Django 則會用一個類名字的 munged 版本來代替: CamelCase becomes camel case.
verbose_name_plural
這個選項是指定,模型的複數形式是什麼,比如:
verbose_name_plural = “stories”
若未提供該選項, Django 會使用 verbose_name + “s”.