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

Django 模型層 Meta 選項詳解

Meta 是 Django 模型類的一個內部類,用於定義一些與 Django 特定模型相關的一些選項。

可選的選項有

1. abstract

表示模型是否是抽象基類,abstract = True,則表示模型是抽象基類。 所謂抽象基類,指該模型不會對應資料庫表,即 Django 不會在資料庫中為該模型建立表。一般情況下,我們使用抽象基類來定義一組公共屬性的欄位,其他需要使用這組欄位的模型只要直接繼承這個抽象類就可以擁有該組欄位。

2. app_label

如果模型類不在應用程式的 model.py 下,而是來自其他應用程式,則必須要指定 app_label。 如:

app_label = 'other_app'

3. db_table

該模型所用的資料庫表的名稱:

db_table = 'myapp'

關於資料庫表名稱: 預設情況下,Django 會按一定規則為模型類自動指定資料庫表名稱,名稱由模型的“應用標籤”(在manage.py startapp中使用的名稱)和模型類名稱之間加上下劃線組成,如:myapp_model1。 如果想使用自定義的表名,就需要通過 db_table 屬性指定。

4. db_tablespace

有些資料庫有資料庫表空間,比如 Oracle。可以通過 db_tablespace 來指定這個模型對應的資料庫表放在哪個資料庫表空間。 預設值是專案設定中 的 DEFAULT_TABLESPAC。 如果資料庫並不支援表空間,這個選項可以忽略。

5. related_name

關聯物件反向引用的標識,預設為:<model_name>_set。 假設有兩個 model,分別為 Book 和 Author,其中 Book 模型有指向 Author 的外來鍵:

class Book(models.Model):
    author = models.ForeignKey(Author)

那麼,Author 可以通過 book_set 關聯到 Book。 通過 related_name 可以修改這個標識。

6. get_latest_by

Django Manager 的 latest() 和 earliest() 可以得到最近一行的記錄,get_latest_by 可以指定它們使用的預設欄位。 get_latest_by 的值必須是模型中某個可排序的欄位的名稱,比如DateField、DateTimeField 或者 IntegerField。

7. managed

預設為 True,意思是 Django 會在 migrate 命令中為模型建立合適的資料表,並且會在 flush 管理命令中移除它們。換句話說,Django 會管理這些資料表的生命週期。

如果是 False,Django 就不會為當前模型建立和刪除資料表。如果當前模型表示一個已經存在的,通過其它方法建立的資料庫檢視或者資料表,這會相當有用。

8. order_with_respect_to

按照給定的欄位把這個物件標記為“可排序的”。 這一屬性通常用到關聯物件上面(一對多,多對多關係中),它指向一個關聯物件,這樣關聯物件在找到這個物件後它是經過排序的。 比如,如果 Answer 和 Question 相關聯,一個問題有至少一個答案,並且答案的順序非常重要,你可以這樣做:

from django.db import models

class Question(models.Model):
    text = models.TextField()
    # ...

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 是小寫的模型名稱。在以上例子中,一個 Question 物件有很多相關聯的 Answer 物件,返回的列表中含有與之相關聯Answer物件的主鍵:

>>> question = Question.objects.get(id=1)
>>> question.get_answer_order()
[1, 2, 3]

與 Question 物件相關聯的 Answer 物件的順序,可以通過傳入一格包含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,所以如果你在首次遷移之後新增或者修改了order_with_respect_to 屬性,要確保執行和應用了合適的遷移操作。

9. ordering

表示使用 Django 的資料庫 API 檢索時,返回的結果按照哪個欄位進行排序。 ordering 的值是一個字串的列表或者元組,每個字串表示一個欄位名。ordering 支援升序排序,倒敘排序和隨機排序

  1. ordering = ['created_date'] 表示按 created_date 升序排序
  2. ordering = ['-created_date'] 表示按 created_date 倒序排序
  3. ordering = ['?created_date'] 表示隨機排序

如果 ordering 的值是一個元組,則結果按元組裡元素的順序進行排序,例如: ordering = ['publish_date','-created_date'] 表示結果先按 publish_date 升序排序,再按 created_date 倒序排序,依此類推。警告: 排序並不是沒有任何代價的操作。你向 ordering 屬性新增的每個欄位都會產生你資料庫的開銷,你新增的每個外來鍵也會隱式包含它的預設順序。

10. permissions

主要是為了在 Django Admin 管理模組下使用的。 表示建立物件時許可權表中額外的許可權。增加、刪除和修改許可權會自動為每個模型建立。 可以為模型指定其他的許可權:

permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)

這個例子指定了一種額外的許可權,can_deliver_pizzas。 它是一個包含二元組的元組或者列表,格式為 (permission_code, human_readable_permission_name)。

11. default_permissions

New in Django 1.7. 預設為('add', 'change', 'delete')。你可以自定義這個列表,比如,如果你的應用不需要預設許可權中的任何一項,可以把它設定成空列表。在模型被 migrate 命令建立之前,這個屬性必須被指定,以防一些遺漏的屬性被建立。

12. proxy

如果 proxy = True, 它作為另一個模型的子類,將會作為一個代理模型。

13. unique_together

當需要通過兩個欄位保持模型唯一性時使用。 假設有一個 User 類,我們希望 User 的 username 和 email 兩個屬性的組合必須是唯一的,那麼需要設定為:

unique_together = (("username", "email"),)

unique_together 的值是一個元組的元組。為了方便起見,處理單一欄位的集合時,unique_together 可以是一維的元組,如:

unique_together = ("driver", "restaurant")

ManyToManyField 不能包含在 unique_together 中。如果你需要驗證ManyToManyField 關聯的唯一性,試著使用訊號或者顯式的貫穿模型(explicit through model)。

Changed in Django 1.7: 當 unique_together 的約束被違反時,模型校驗期間會丟擲ValidationError 異常。

14. index_together

用來設定帶有索引的欄位組合:

index_together = [
    ["pub_date", "deadline"],
]

列表中的欄位將會建立索引(例如,會在CREATE INDEX語句中被使用)。

Changed in Django 1.7. 為了方便起見,處理單一欄位的集合時,index_together 可以是一個一維的列表。

index_together = ["pub_date", "deadline"]

15. verbose_name

為模型指定一個更可讀的名稱,為單數。

verbose_name = "book"

如果此項沒有設定,Django 會把類名拆分開來作為自述名,比如CamelCase 會變成 camel case,

16. verbose_name_plural

模型複數形式的名稱:

verbose_name_plural = "books"

如果此項沒有設定,Django 會使 用 verbose_name + "s"。