使用 Querysets 和管理器方法定義基本管理器

Django manger 是 django 模型通過其查詢資料庫的介面。大多數 django 查詢中使用的 objects 欄位實際上是 django 為我們建立的預設管理器(僅當我們不定義自定義管理器時才會建立)。

我們為什麼要定義自定義管理器/查詢集?

避免在我們的程式碼庫中編寫常見查詢,而是使用更容易記住的抽象來引用它們。示例:確定哪個版本更具可讀性:

  • 只獲得所有活躍使用者:User.objects.filter(is_active=True) vs User.manager.active()
  • 讓所有活躍的面板科醫生參與我們的平臺:User.objects.filter(is_active=True).filter(is_doctor=True).filter(specialization='Dermatology') vs User.manager.doctors.with_specialization('Dermatology')

另一個好處是,如果明天我們決定所有 psychologists 也是 dermatologists,我們可以在我們的經理中輕鬆修改查詢並完成它。

下面是建立通過建立 QuerySet 並使用 as_manager 方法定義的自定義 Manager 的示例。

from django.db.models.query import QuerySet

class ProfileQuerySet(QuerySet):
    def doctors(self):
        return self.filter(user_type="Doctor", user__is_active=True)

    def with_specializations(self, specialization):
        return self.filter(specializations=specialization)

    def users(self):
        return self.filter(user_type="Customer", user__is_active=True)

ProfileManager = ProfileQuerySet.as_manager

我們將它新增到我們的模型中,如下所示:

class Profile(models.Model):
    ...
    manager = ProfileManager()

注意 :一旦我們在模型上定義了 manager,就不再為模型定義 objects 了。