管理器Manager
管理器是Django的模型進行數據庫操作的接口,Django應用的每個模型類都擁有至少一個管理器。
我們在通過模型類的objects屬性提供的方法操作數據庫時,即是在使用一個管理器對象objects。當沒有爲模型類定義管理器時,Django會爲每一個模型類生成一個名爲objects的管理器,它是models.Manager類的對象。
自定義管理器
我們可以自定義管理器,並應用到我們的模型類上。
注意:一旦爲模型類指明自定義的過濾器後,Django不再生成默認管理對象objects。
自定義管理器類主要用於兩種情況
- 準備工作:把bookinfo表中的一條記錄is_delete字段修改成True
- 問題:邏輯刪除字段爲True的那條記錄依然會被查詢出來
-
修改原始查詢集,重寫all()方法。
a、 打開book/models.py文件,定義類BookInfoManager
class BookInfoManager(models.Manager): def all(self): #默認查詢未刪除的圖書信息 #調用父類的成員語法爲:super().方法名 return super().filter(is_delete=False)
b、 在模型類BookInfo中定義管理器
class BookInfo(models.Model): ... books = BookInfoManager()
c、 使用方法
>>> books = BookInfo.books.all() >>> books <QuerySet [<BookInfo: 天龍八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飛狐>, <BookInfo: python入門>]>
d、 視圖方法
# 書籍列表信息視圖 def bookList(request): # 查詢數據庫書籍列表數據 # books = BookInfo.objects.all() books = BookInfo.books.all() # 構造上下文 context = {'books':books} # 數據交給模板處理,處理完成後通過視圖響應給客戶端 return render(request, 'Book/booklist.html', context)
-
在管理器類中補充定義新的方法
a、 打開book/models.py文件,定義方法create。
class BookInfoManager(models.Manager): def create_book(self,name,pub_date): # 創建模型類對象self.model可以獲得模型類 book = self.model() book.name = name book.pub_date = pub_date book.save() return book
b、 爲模型類BookInfo定義管理器books語法如下
class BookInfo(models.Model): ... books = BookInfoManager()
c、 調用語法如下:
>>> from book.models import BookInfo >>> book = BookInfo.books.create_book('python高級','2010-1-1') >>> book <BookInfo: python高級>