前面介紹了 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引數的使用
如果想獲取更多相關文章,可掃碼關注閱讀:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548138.html
標籤:Python
