1. 程式人生 > >Django模型之Meta選項詳解

Django模型之Meta選項詳解

Django模型類的Meta是一個內部類,它用於定義一些Django模型類的行為特性。而可用的選項大致包含以下幾類

abstract

這個屬性是定義當前的模型是不是一個抽象類。所謂抽象類是不會對應資料庫表的。一般我們用它來歸納一些公共屬性欄位,然後繼承它的子類可以繼承這些欄位。

Options.abstract 如果abstract = True 這個model就是一個抽象類

app_label

這個選型只在一種情況下使用,就是你的模型不在預設的應用程式包下的models.py檔案中,這時候需要指定你這個模型是哪個應用程式的。

Options.app_label 如果一個model定義在預設的models.py,例如如果你的app的models在myapp.models子模組下,你必須定義app_label讓Django知道它屬於哪一個app app_label = 'myapp'

db_table

db_table是指定自定義資料庫表明的。Django有一套預設的按照一定規則生成資料模型對應的資料庫表明。 Options.db_table 定義該model在資料庫中的表名稱   db_table = 'Students' 如果你想使用自定義的表名,可以通過以下該屬性   table_name = 'my_owner_table'

db_teblespace

Options.db_teblespace 定義這個model所使用的資料庫表空間。如果在專案的settin中定義那麼它會使用這個值

get_latest_by

Options.get_latest_by 在model中指定一個DateField或者DateTimeField。這個設定讓你在使用model的Manager上的lastest方法時,預設使用指定欄位來排序

managed

Options.managed 預設值為True,這意味著Django可以使用syncdb和reset命令來建立或移除對應的資料庫。預設值為True,如果你不希望這麼做,可以把manage的值設定為False

order_with_respect_to

這個選項一般用於多對多的關係中,它指向一個關聯物件,就是說關聯物件找到這個物件後它是經過排序的。指定這個屬性後你會得到一個get_xxx_order()和set_xxx_order()的方法,通過它們你可以設定或者回去排序的物件

ordering

這個欄位是告訴Django模型物件返回的記錄結果集是按照哪個欄位排序的。這是一個字串的元組或列表,沒有一個字串都是一個欄位和用一個可選的表明降序的'-'構成。當欄位名前面沒有'-'時,將預設使用升序排列。使用'?'將會隨機排列

  • ordering=['order_date'] # 按訂單升序排列
  • ordering=['-order_date'] # 按訂單降序排列,-表示降序
  • ordering=['?order_date'] # 隨機排序,?表示隨機
  • ordering=['-pub_date','author'] # 以pub_date為降序,在以author升序排列

permissions

permissions主要是為了在Django Admin管理模組下使用的,如果你設定了這個屬性可以讓指定的方法許可權描述更清晰可讀。Django自動為每個設定了admin的物件建立新增,刪除和修改的許可權。 permissions = (('can_deliver_pizzas','Can deliver pizzas'))

proxy

這是為了實現代理模型使用的,如果proxy = True,表示model是其父的代理 model 

unique_together

unique_together這個選項用於:當你需要通過兩個欄位保持唯一性時使用。比如假設你希望,一個Person的FirstName和LastName兩者的組合必須是唯一的,那麼需要這樣設定: unique_together = (("first_name", "last_name"),) 一個ManyToManyField不能包含在unique_together中。如果你需要驗證關聯到ManyToManyField欄位的唯一驗證,嘗試使用signal(訊號)或者明確指定through屬性。

verbose_name

verbose_name的意思很簡單,就是給你的模型類起一個更可讀的名字一般定義為中文,我們: verbose_name = "學校"

verbose_name_plural

這個選項是指定,模型的複數形式是什麼,比如: verbose_name_plural = "學校" 如果不指定Django會自動在模型名稱後加一個’s’