Django -- class Meta:詳解


模型元數據是“任何不是字段的數據”,比如排序選項(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--抽象類

  1. 這個屬性是定義當前的模型類是不是一個抽象類
  2. 所謂抽象類是不會生成相應數據庫表的
  3. 一般我們用它來歸納一些公共屬性字段,然后繼承它的子類能夠繼承這些字段。

比方以下的代碼中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--重寫數據表名稱

  1. 默認情況下,Django 會根據模型類的名稱和包含它的應用的名稱自動指定數據庫表名稱。eg:blog_type(blog:APP名稱,type:模型類名稱)
  2. 使用 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--管理表的創建、刪除

  1. 默認為True,意思是Django在migrate命令中創建合適的數據表,並且會在 flush 管理命令中移除它們。換句話說,Django會管理這些數據表的生命周期。
  2. 如果是False,Django 就不會為當前模型創建和刪除數據表。如果當前模型表示一個已經存在的,通過其它方法建立的數據庫視圖或者數據表,這會相當有用
  3. 當設置為managed=False時,需要注意一下幾點:
    • 如果你不聲明它的話,會向你的模型中添加一個自增主鍵。為了避免給后面的代碼讀者帶來混亂,強烈推薦你在使用未被管理的模型時指定數據表中所有的列
    • 如果一個帶有managed=False的模型含有指向其他未被管理模型的ManyToManyField,那么多對多連接的中介表不會被創建
    • 但是,一個被管理模型和一個未被管理模型之間的中介表會被創建。
    • 如果你需要修改這一默認行為,創建中介表作為顯式的模型(設置為managed),並且使用ManyToManyField.through為你的自定義模型創建關聯。
    • 對於帶有managed=False的模型的測試,你要確保在測試啟動時建立正確的表

4、ordering--排序

對象默認的順序,獲取一個對象的列表時使用:

ordering = ['-order_date']
它是一個字符串的列表或元組。每個字符串是一個字段名,前面帶有可選的“-”前綴表示倒序。前面沒有“-”的字段表示正序。使用"?"來表示隨機排序

  1. 例如,要按照pub_date字段的正序排序,這樣寫:                       ordering = ['pub_date']
  2. 按照pub_date字段的倒序排序,這樣寫:                                     ordering = ['-pub_date']
  3. 先按照pub_date的倒序排序,再按照 author 的正序排序,這樣寫:  ordering = ['-pub_date', 'author']

警告:

  排序並不是沒有任何代價的操作。你向ordering屬性添加的每個字段都會產生你數據庫的開銷。你添加的每個外鍵也會隱式包含它的默認順序

5、unique_together--添加unique

用來設置的不重復的字段組合unique_together = (("driver", "restaurant"),)

  1. 它是一個元組的元組,組合起來的時候必須是唯一的
  2. 它在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"。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM