Django之Model的Meta選項詳解

2021-08-18 21:22:55 字數 3278 閱讀 5287

django預設生成的表名:

應用名小寫_模型類名小寫
可以通過在模型類中定義meta類來修改表名:

class department(models.model):

"""部門類"""

name = models.charfield(max_length=20)

create_date = models.datefield(auto_now_add=true)

# 使用自定義的模型管理器(預設的objects就不會在使用)

objects = departmentmanager()

def __str__(self):

return self.name

class meta(object):

# 定義表名

db_table = "department"

# 定義在管理後台顯示的名稱

verbose_name = '部門'

# 定義複數時的名稱(去除複數的s)

verbose_name_plural = verbose_name

django模型類的meta是乙個內部類,它用於定義一些django模型類的行為特性。而可用的選項大致包含以下幾類

這個屬性是定義當前的模型是不是乙個抽象類。所謂抽象類是不會對應資料庫表的。一般我們用它來歸納一些公共屬性字段,然後繼承它的子類可以繼承這些字段。

options.abstract

如果abstract = true 這個model就是乙個抽象類

這個選型只在一種情況下使用,就是你的模型不在預設的應用程式包下的models.py檔案中,這時候需要指定你這個模型是哪個應用程式的。

db_table是指定自定義資料庫表明的。django有一套預設的按照一定規則生成資料模型對應的資料庫表明。

options.db_table

定義該model在資料庫中的表名稱

db_table = 'students'

如果你想使用自定義的表名,可以通過以下該屬性

table_name = 'my_owner_table'

資料表名稱

使用 meta類中的 db_table 引數來重寫資料表的名稱。

資料表名稱可以是 sql 保留字,也可以包含不允許出現在 python 變數中的特殊字元,這是因為 django 會自動給列名和表名新增引號。

在 mysql中使用小寫字母為表命名

當你通過db_table覆寫表名稱時,強烈推薦使用小寫字母給表命名,特別是如果你用了mysql作為後端。

oracle中表名稱的引號處理

為了遵從oracle中30個字元的限制,以及一些常見的約定,django會縮短表的名稱,而且會把它全部轉為大寫。在db_table的值外面加上引號來避免這種情況:

db_table = '"name_left_in_lowercase"'
這種帶引號的名稱也可以用於django所支援的其他資料庫後端,但是除了oracle,引號不起任何作用。

options.db_teblespace

定義這個model所使用的資料庫表空間。如果在專案的settin中定義那麼它會使用這個值

options.get_latest_by

在model中指定乙個datefield或者datetimefield。這個設定讓你在使用model的manager上的lastest方法時,預設使用指定欄位來排序

options.managed

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

如果是false,django 就不會為當前模型建立和刪除資料表。如果當前模型表示乙個已經存在的,通過其它方法建立的資料庫檢視或者資料表,這會相當有用。這是設定為managed=false時唯一的不同之處。. 模型處理的其它任何方面都和平常一樣。這包括:

如果你不宣告它的話,會向你的模型中新增乙個自增主鍵。為了避免給後面的**讀者帶來混亂,強烈推薦你在使用未被管理的模型時,指定資料表中所有的列。

如果乙個帶有managed=false的模型含有指向其他未被管理模型的manytomanyfield,那麼多對多連線的中介表也不會被建立。但是,乙個被管理模型和乙個未被管理模型之間的中介表會被建立。

如果你需要修改這一預設行為,建立中介表作為顯式的模型(設定為managed),並且使用manytomanyfield.through為你的自定義模型建立關聯。

對於帶有managed=false的模型的測試,你要確保在測試啟動時建立正確的表。

如果你對修改模型類在python層面的行為感興趣,你可以設定 managed=false ,並且為乙個已經存在的模型建立乙個副本。

這個選項一般用於多對多的關係中,它指向乙個關聯物件,就是說關聯物件找到這個物件後它是經過排序的。指定這個屬性後你會得到乙個get_***_order()和set_***_order()的方法,通過它們你可以設定或者回去排序的物件

這個欄位是告訴django模型物件返回的記錄結果集是按照哪個字段排序的。這是乙個字串的元組或列表,沒有乙個字串都是乙個欄位和用乙個可選的表明降序的'-'構成。當欄位名前面沒有'-'時,將預設使用公升序排列。使用'?'將會隨機排列

permissions主要是為了在django admin管理模組下使用的,如果你設定了這個屬性可以讓指定的方法許可權描述更清晰可讀。django自動為每個設定了admin的物件建立新增,刪除和修改的許可權。

permissions = (('can_deliver_pizzas','can deliver pizzas'))

這是為了實現**模型使用的,如果proxy = true,表示model是其父的** model 

unique_together這個選項用於:當你需要通過兩個字段保持唯一性時使用。比如假設你希望,乙個person的firstname和lastname兩者的組合必須是唯一的,那麼需要這樣設定:

unique_together = (("first_name", "last_name"),)

乙個manytomanyfield不能包含在unique_together中。如果你需要驗證關聯到manytomanyfield欄位的唯一驗證,嘗試使用signal(訊號)或者明確指定through屬性。

verbose_name的意思很簡單,就是給你的模型類起乙個更可讀的名字一般定義為中文,我們:

verbose_name = "學校"

這個選項是指定,模型的複數形式是什麼,比如:

verbose_name_plural = "學校"

如果不指定django會自動在模型名稱後加乙個』s』

django之model中資料庫查詢

假如現在models.py中已經下面這個類,並且已經建立了相應的表 class stu models.model stu id models.charfield max length 20 學號 name models.charfield max length 50,unique true 姓名 p...

Django之Model資料庫表結構

表結構修改後,原來表中已存在的資料,就會出現結構混亂,makemigrations更新表的時候就會出錯 解決方法 1 新增加的字段,設定允許為空。生成表的時候,之前資料新增加的字段就會為空。null true允許資料庫中為空,blank true允許admin後台中為空 2 新增加的字段,設定乙個預...

Django學習筆記(二) model

django 中的乙個model對應資料庫中的一張資料表 django 中models以類的形式表現 它包含一些基本字段以及資料的一些行為 也就是說,django中所有對資料庫的操作,都是對資料類的操作。不許要寫sql語句。實現了物件和資料庫之間的對映,隱藏了資料訪問的細節,不需要編寫sql語句 具...