django的模型類管理器——數(shù)據(jù)庫操作的封裝詳解
模型實例方法
str():在將對象轉(zhuǎn)換成字符串時會被調(diào)用。
save():將模型對象保存到數(shù)據(jù)表中,ORM框架會轉(zhuǎn)換成對應(yīng)的insert或update語句。
delete():將模型對象從數(shù)據(jù)表中刪除,ORM框架會轉(zhuǎn)換成對應(yīng)的delete語句。
模型類的屬性
屬性objects:管理器,是Manager類型的對象,用于與數(shù)據(jù)庫進行交互。
當沒有為模型類定義管理器時,Django會為模型類生成一個名為objects的管理器,自定義管理器后,Django不再生成默認管理器objects。
管理器是Django的模型進行數(shù)據(jù)庫操作的接口,Django應(yīng)用的每個模型都擁有至少一個管理器。Django支持自定義管理器類,繼承自models.Manager。
自定義管理器類主要用于兩種情況:
1.修改原始查詢集,重寫all()方法
2.向管理器類中添加額外的方法,如向數(shù)據(jù)庫中插入數(shù)據(jù)。
1.修改原始查詢集,重寫all()方法。
#圖書管理器class BookInfoManager(models.Manager): def all(self): #默認查詢未刪除的圖書信息 #調(diào)用父類的成員語法為:super().方法名 return super().all().filter(isDelete=False)
b)在模型類BookInfo中定義管理器
class BookInfo(models.Model): ... books = BookInfoManager()
2.在管理器類中定義創(chuàng)建對象的方法
當創(chuàng)建模型類對象時,django不會對數(shù)據(jù)庫進行讀寫操作,調(diào)用save()方法才與數(shù)據(jù)庫交互,進行insert或update操作,將數(shù)據(jù)保存到數(shù)據(jù)庫中。如果模型類的屬性比較多,逐個屬性賦值很麻煩,推薦使用管理器
class BookInfoManager(models.Manager): ... #創(chuàng)建模型類,接收參數(shù)為屬性賦值 def create_book(self, title, pub_date): #創(chuàng)建模型類對象self.model可以獲得模型類 book = self.model() book.btitle = title book.bpub_date = pub_date book.bread=0 book.bcommet=0 book.isDelete = False # 將數(shù)據(jù)插入進數(shù)據(jù)表 book.save() return book
b)為模型類BookInfo定義管理器books語法如下
class BookInfo(models.Model): ... books = BookInfoManager()
c)調(diào)用語法如下:
調(diào)用:
book=BookInfo.books.create_book('abc',date(1980,1,1))
補充知識:Django中的模型類管理器以及自定義管理器
模型類.objects.all()->objects是一個什么東西呢?
答:objects是Django幫我自動生成的管理器對象,通過這個管理器可以實現(xiàn)對數(shù)據(jù)的查詢。
objects是models.Manger類的一個對象
自定義管理器之后Django不再幫我們生成默認的objects管理器。
使用博客之前使用過的模型類,然后在項目的shell中導入模型類,進行查看類型
自定義模型管理器類
自定義一個管理器類,這個類繼承models.Manger類。
再在具體的模型類里定義一個自定義管理器類的對象。
定義一個模型管理器類,然后在模型類中使用
class BookInfoManager(models.Manager): '''圖書模型管理器類''' pass class BookInfo(models.Model): '''圖書模型類''' # 圖書名稱 btitle = models.CharField(max_length=20) # 出版日期 bpub_date = models.DateField() # 閱讀量 bread = models.IntegerField(default=0) # 評論量 bcomment = models.IntegerField(default=0) # 刪除標記 isDelete = models.BooleanField(default=False) ’’’自定義管理器’’’ book = BookInfoManager()
然后在項目的shell中,
我們一旦自定義了管理器,就要使用定義的管理器查詢,可以看到我們自定義的Manager
自定義管理器類的應(yīng)用場景
1.改變查詢的結(jié)果集。
比如調(diào)用BookInfo.books.all()返回的是沒有刪除的圖書的數(shù)據(jù)。
2.添加額外的方法。
管理器類中定義一個方法幫我們操作模型類對應(yīng)的數(shù)據(jù)表。
使用self.model()就可以創(chuàng)建一個跟自定義管理器對應(yīng)的模型類對象。
1.舉例,模型類對應(yīng)的表中有這個表
現(xiàn)在通過BookInfo.book.all()自定義管理器只取到isDelete為0的數(shù)據(jù)
重寫all()方法,如果有其他的需求的時候可以重新其他對應(yīng)的方法
class BookInfoManager(models.Manager): '''圖書模型管理器類''' # 改變查詢的結(jié)果集 def all(self): # 1.調(diào)用父類的all,獲取所有數(shù)據(jù) books = super().all() # QuerySet # 2.對數(shù)據(jù)進行過濾 books = books.filter(isDelete=False) # 3.返回books return books
然后進行驗證,重新打開項目的shell,進行查詢之后就獲取到了4條數(shù)據(jù)(過濾掉了一條)
2.為模型類添加額外的方法,使其通過模型類.方法名就可以插入保存數(shù)據(jù)
class BookInfoManager(models.Manager): '''圖書模型管理器類''' # 改變查詢的結(jié)果集 def all(self): # 1.調(diào)用父類的all,獲取所有數(shù)據(jù) books = super().all() # QuerySet # 2.對數(shù)據(jù)進行過濾 books = books.filter(isDelete=False) # 3.返回books return books # 封裝函數(shù):操作模型類對應(yīng)的數(shù)據(jù)表 ’’’添加額外的方法’’’ def create_book(self, btitle, bpub_date): # 1.創(chuàng)建一個圖書對象 model_class = self.model book = model_class() book.btitle = btitle book.bpub_date = bpub_date # 2. 保存進數(shù)據(jù)庫 book.save() # 3. 返回obj return book
然后重新進入到項目的shell中進行插入,注意:日期要符合日期字符串的格式,或者使用date()函數(shù)
數(shù)據(jù)中也相應(yīng)的有了該條數(shù)據(jù),因為我們在額外的方法中使用了save()函數(shù)保存到數(shù)據(jù)庫
這個額外的方法通常寫在管理器中,當然也可以寫在模型類中,當寫在模型類中,使用的時候則直接模型類調(diào)用該方法就行了,并且定義成模型類的類方法。注意區(qū)別
把方法定義在管理器的時候,管理器中有個自帶的方法create(),使用這個時候必須帶參數(shù)
數(shù)據(jù)庫就已經(jīng)有了
模型管理器類和模型類的關(guān)系
以上這篇django的模型類管理器——數(shù)據(jù)庫操作的封裝詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. ASP中if語句、select 、while循環(huán)的使用方法2. phpstudy apache開啟ssi使用詳解3. CSS 使用Sprites技術(shù)實現(xiàn)圓角效果4. 利用FastReport傳遞圖片參數(shù)在報表上展示簽名信息的實現(xiàn)方法5. 詳解瀏覽器的緩存機制6. chat.asp聊天程序的編寫方法7. ASP常用日期格式化函數(shù) FormatDate()8. 怎樣才能用js生成xmldom對象,并且在firefox中也實現(xiàn)xml數(shù)據(jù)島?9. HTML中的XML數(shù)據(jù)島記錄編輯與添加10. 推薦一個好看Table表格的css樣式代碼詳解
