電腦編程說到底還是程式員的思維體現,人情世故也會反映在代碼的邏輯上, 寫代碼就如學做人一樣,從哪裡來到哪裡去 ...
前面介紹了 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 等。
本文首發於本人微信公眾號:Django筆記。
原文鏈接:Django筆記八之model中Meta參數的使用
如果想獲取更多相關文章,可掃碼關註閱讀: