Django Manager管理器

管理器Manager

管理器是Django的模型進行數據庫操作的接口,Django應用的每個模型類都擁有至少一個管理器。

我們在通過模型類的objects屬性提供的方法操作數據庫時,即是在使用一個管理器對象objects。當沒有爲模型類定義管理器時,Django會爲每一個模型類生成一個名爲objects的管理器,它是models.Manager類的對象。

自定義管理器

我們可以自定義管理器,並應用到我們的模型類上。

注意:一旦爲模型類指明自定義的過濾器後,Django不再生成默認管理對象objects。

自定義管理器類主要用於兩種情況

  • 準備工作:把bookinfo表中的一條記錄is_delete字段修改成True
    在這裏插入圖片描述
  • 問題:邏輯刪除字段爲True的那條記錄依然會被查詢出來
  1. 修改原始查詢集,重寫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)
    
  2. 在管理器類中補充定義新的方法

    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高級>
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章