模型元數據是“任何不是字段的數據”,比如排序選項(ordering),數據庫表名(db_table)或者人類可讀的單復數名稱(verbose_name 和verbose_name_plural)。在模型中添加class Meta是完全可選的,所有選項都不是必須的。
class Book(models.Model): name =models.CharField(max_length=32) def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=32) m = models.ManyToManyField('Book') def __str__(self): return self.name class A_to_B(models.Model): bid = models.ForeignKey(Book) aid = models.ForeignKey(Author) class Meta: unique_together = ( ('bid','aid'), )
上面定義了3張表,一張是Book表,一張是Author表,然后定義了一個多對多關系的A_to_B表,最后定義了元數據,它的意思上面的多對多表具有唯一約束。
可用的元選項
1、abstract--抽象類
- 這個屬性是定義當前的模型類是不是一個抽象類。
- 所謂抽象類是不會生成相應數據庫表的。
- 一般我們用它來歸納一些公共屬性字段,然后繼承它的子類能夠繼承這些字段。
比方以下的代碼中Human是一個抽象類。Employee是一個繼承了Human的子類,那么在執行數據遷移命令時,不會生成Human表,可是會生成一個Employee表,它包括了Human中繼承來的字段。
然后, 假設再加入一個Customer模型類,它能夠相同繼承Human的公共屬性:
class Human(models.Model): name=models.CharField(max_length=100) GENDER_CHOICE=((u'M',u'Male'),(u'F',u'Female'),) gender=models.CharField(max_length=2,choices=GENDER_CHOICE,null=True)
class Meta: abstract=True
class Employee(Human): joint_date=models.DateField()
class Customer(Human): first_name=models.CharField(max_length=100) birth_day=models.DateField()
2、db_table--重寫數據表名稱
- 默認情況下,Django 會根據模型類的名稱和包含它的應用的名稱自動指定數據庫表名稱。eg:blog_type(blog:APP名稱,type:模型類名稱)
- 使用 Meta類中的 db_table 參數來重寫數據表的名稱
class Book(models.Model): name =models.CharField(max_length=32) def __str__(self): return self.name
class Meta: db_table = "book"
3、managed--管理表的創建、刪除
- 默認為True,意思是Django在migrate命令中創建合適的數據表,並且會在 flush 管理命令中移除它們。換句話說,Django會管理這些數據表的生命周期。
- 如果是False,Django 就不會為當前模型創建和刪除數據表。如果當前模型表示一個已經存在的,通過其它方法建立的數據庫視圖或者數據表,這會相當有用。
- 當設置為managed=False時,需要注意一下幾點:
- 如果你不聲明它的話,會向你的模型中添加一個自增主鍵。為了避免給后面的代碼讀者帶來混亂,強烈推薦你在使用未被管理的模型時,指定數據表中所有的列。
- 如果一個帶有managed=False的模型含有指向其他未被管理模型的ManyToManyField,那么多對多連接的中介表也不會被創建。
- 但是,一個被管理模型和一個未被管理模型之間的中介表會被創建。
- 如果你需要修改這一默認行為,創建中介表作為顯式的模型(設置為managed),並且使用ManyToManyField.through為你的自定義模型創建關聯。
- 對於帶有managed=False的模型的測試,你要確保在測試啟動時建立正確的表。
4、ordering--排序
對象默認的順序,獲取一個對象的列表時使用:
ordering = ['-order_date']
它是一個字符串的列表或元組。每個字符串是一個字段名,前面帶有可選的“-”前綴表示倒序。前面沒有“-”的字段表示正序。使用"?"來表示隨機排序。
- 例如,要按照pub_date字段的正序排序,這樣寫: ordering = ['pub_date']
- 按照pub_date字段的倒序排序,這樣寫: ordering = ['-pub_date']
- 先按照pub_date的倒序排序,再按照 author 的正序排序,這樣寫: ordering = ['-pub_date', 'author']
警告:
排序並不是沒有任何代價的操作。你向ordering屬性添加的每個字段都會產生你數據庫的開銷。你添加的每個外鍵也會隱式包含它的默認順序。
5、unique_together--添加unique
用來設置的不重復的字段組合:unique_together = (("driver", "restaurant"),)
- 它是一個元組的元組,組合起來的時候必須是唯一的。
- 它在Django后台中被使用,在數據庫層上約束數據(比如,在 CREATE TABLE 語句中包含 UNIQUE語句)。
為了方便起見,處理單一字段的集合時,unique_together 可以是一維的元組:
unique_together = ("driver", "restaurant")
6、index_together--添加索引
用來設置帶有索引的字段組合:
index_together = [
["pub_date", "deadline"],
]
列表中的字段將會建立索引(例如,會在CREATE INDEX語句中被使用)。
為了方便起見,處理單一字段的集合時,index_together可以是一個一維的列表:index_together = ["pub_date", "deadline"]
7、verbose_name--模型類的單數名稱
對象的一個易於理解的名稱,為單數:
verbose_name = "pizza"
如果此項沒有設置,Django會把類名拆分開來作為自述名,比如CamelCase 會變成camel case
8、verbose_name_plural--模型類的復數名稱
該對象復數形式的名稱:
verbose_name_plural = "stories"
如果此項沒有設置,Django 會使用 verbose_name + "s"。