本文首發於微信公眾號:Hunter後端
原文鏈接:Django筆記八之model中Meta參數的使用
前面介紹了 model 的字段屬性,字段類型,這篇筆記介紹一下 model 的 Meta 選項。
這個選項提供了一些參數,比如排序(ordering),表名(db_table)等。
但這都不是必需的,都是作為可選項,主要是為使用者提供方便的、自定義的一些用法。
以下是本次筆記的目錄列表:
- db_table
- get_latest_by
- managed
- ordering
1、db_table
一般如果我們創建 model 的時候不指定表名,系統在 makemigration 和 migrate 的時候會默認給我們添加表名。
規則是:app_name + "_" + model_name 的小寫。
比如一個 model 為 TestTableName,放在 blog 這個 application 下,那麼在遷移的時候,數據庫表名則是:blog_testtablename。
注意: 上述情況使用的數據庫是 oracle,且表名過長,則會因為 oracle 有一個表名長度的限制,會截取表名的長度。
而如果我們在 Meta 裏使用 db_table 參數,則可以直接指定表名,且無視 application 名稱前綴的規定。
以下是使用示例:
class TestModel(models.Model):
pass
class Meta:
db_table = 'test_table'
那麼在執行 migration 的時候,系統會為這個 model 創建表名為 test_table 的表。
以上也是 Meta 使用的方式。
2、get_latest_by
指定 latest() 函數默認使用的字段。
先來介紹一下 latest() 函數,這個函數的使用方法後面會介紹,有一種用法:TestModel.objects.latest('field_name'),這樣通過指定字段名稱,系統會返回 TestModel 按照字段名為 field_name 排序的最新的一條數據。
而如果我們在 Meta 裏指定了這個參數,那麼我們就就可以在使用上述方法的時候不用指定字段名,按照我們在 Meta 裏指定的字段名來排序返回最新的一條,比如在 Blog model裏我們這樣指定:
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
class Meta:
get_latest_by = "name"
那麼當我們使用
Blog.objects.latest()
系統就會獲取按照 name 字段來排序,取最後一條數據,這個就等價於:
Blog.objects.order_by('name').last()
如果在 Meta 中不指定 get_latest_by 參數,那麼就會按照 id 返回最後一條數據。
注意: 表裏需要有數據,否則會報錯。
3、managed
該參數不設置的時候,默認為 True。
如果為 True,那麼對這個 model 的每次更改,都會在 makemigrations 的時候被檢測到。
這個字段如果為 False,表示 Django 在 makemigrations 的時候會忽略檢測這張表,常用在僅用於系統查詢的表。
用法如下:
class Blog(models.Model):
pass
class Meta:
managed = True
4、ordering
返回數據的默認字段排序。
比如 Blog model,如果我們沒有在 Meta 裏設置 ordering 的話,當我們使用 Blog 篩選數據的時候,會默認按照 id 正序來返回數據,如果我們在 Meta 裏設置了 ordering 這個參數,那麼當我們在篩選的時候不使用 order_by() 參數,則會按照我們在 ordering 裏設置的字段來排序。
比如,當我們設置:
class Blog(models.Model):
pass
class Meta:
ordering = ["name"]
設置ordering 為 ["name"] 之後,Blog.objects.first() 返回的第一條數據,就是按照 name 進行正序排序之後的第一條。
如果想倒序排序,在字段名前加上 '-' 減號即可:ordering = ["-name"]
如果想按照多字段排序:ordering = ["name", "tagline"]
以上就是本篇筆記的全部內容,接下來幾篇筆記中將逐步介紹 Django 的 model 在篩選中的一些用法,比如 filter,exclude,alias,values 等。
如果想獲取更多相關文章,可掃碼關注閲讀: