在之前的帖子中,我們介紹了如何通過Django的ORM來處理數據,即CRUD(創建、讀取、更新、刪除)操作。這次我們將更深入地分析在示例中使用的objects管理器到底是什麼,怎麼組成以及能做什麼。objects是理解Django ORM的關鍵概念之一。


1. objects管理器是什麼?

Django模型的基本結構中最常出現的便是objects這個管理器。objects被稱為Django的模型管理器(Manager),用於查詢或操作數據庫記錄。簡單來說,objects管理器在模型類和數據庫之間搭建了一座橋樑。

Django objects manager diagram

模型類的基本屬性objects是一個Django提供的Manager類的實例。通過此實例可以與數據庫進行交互,進行創建、查詢、修改、刪除等操作。例如,可以使用Post.objects.all()Post.objects.create()等方法訪問數據。


2. Manager類的角色

Manager類是Django模型自帶的數據庫接口,通過它可以執行各種查詢。Django會自動為每個模型生成名為objectsManager,並通過這個Manager來處理大多數的CRUD操作。

CRUD如何通過objects實現,您或許已經有一定了解或經驗。示例代碼在前面的部分已經討論過,因此這裡省略。


3. 創建自定義Manager

內建的objects管理器非常有用,但有時需要重用特定查詢邏輯或執行更複雜的查詢。在這種情況下,可以創建自定義管理器來添加所需的功能。

3.1 定義自定義Manager類

我們可以創建一個自定義管理器,僅過濾已發布的帖子。

from django.db import models

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(status='published')

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    status = models.CharField(max_length=10, choices=[('draft', 'Draft'), ('published', 'Published')])
    publish_date = models.DateTimeField(auto_now_add=True)

    # 除了基本的objects管理器,添加自定義管理器
    published = PublishedManager()

在上面的例子中,我們定義了一個名為PublishedManager的自定義管理器,並將其添加到Post模型中。這個PublishedManager僅過濾返回狀態為'published'的帖子。現在調用Post.published.all()將僅返回已發布的帖子。

3.2 自定義管理器的應用

  • 減少重複代碼:使用自定義管理器可以減少每次添加過濾條件的重複代碼。
  • 封裝特定查詢邏輯:根據特定業務邏輯自定義查詢邏輯,讓其在模型內部進行更清晰的管理。

4. objects管理器能做的多種操作

Django的objects管理器除了提供基本的CRUD功能外,還支持多種數據庫操作。

4.1 數據過濾

  • filter():查詢符合條件的多個對象。
    published_posts = Post.objects.filter(status='published')
  • exclude():查詢不符合特定條件的對象。
    draft_posts = Post.objects.exclude(status='published')

4.2 排序與切片

  • 排序:可以使用order_by()方法對數據進行排序。
    recent_posts = Post.objects.all().order_by('-publish_date')
  • 切片:像Python的列表切片一樣,查詢集也可以通過切片來獲取特定範圍的數據。
    first_three_posts = Post.objects.all()[:3]

4.3 使用聚合函數

objects管理器還提供聚合函數。例如,如果想知道帖子數量,可以使用count()方法。

post_count = Post.objects.count()

此外,還可以使用aggregate()方法執行平均值、總和等聚合運算。

from django.db.models import Avg
average_length = Post.objects.aggregate(Avg('content_length'))

5. objects管理器的工作原理

objects管理器在內部會生成查詢集(QuerySet)對象。查詢集是用於從數據庫檢索數據的查詢集合。每當調用objects.all()objects.filter()等方法時,Django會生成查詢集,並在需要時將相應的查詢傳遞到數據庫以獲取結果。

查詢集使用延遲評估(lazy evaluation)。這意味著在生成查詢集時,並不會實際訪問數據庫,而是延遲到需要數據的時候執行數據庫查詢。這樣可以避免不必要的查詢執行,提高數據處理的效率。


總結

Django的objects管理器簡化了與數據庫的交互,幫助我們更輕鬆地處理數據。除了基本提供的CRUD功能外,還能夠通過定義自定義管理器來重用特定查詢邏輯或簡化更複雜的操作。此外,由於查詢集的延遲評估特性,使得數據處理更加高效。

深入理解Django ORM的objects管理器,將使您能夠更高效地處理數據,減少代碼重複,並以清晰的方式編寫代碼。在未來,請更積極地使用模型管理器,並在需要時引入自定義管理器,這樣可以使Web應用程序中複雜的數據處理變得更加簡單和靈活。

在下一篇中,我們將詳細討論查詢集(QuerySet)及數據查詢。ORM的一個優勢是「不需要了解SQL」,而充分利用這一優勢的關鍵點在於下一篇的內容,敬請期待。