使用 Querysets 和管理器方法定義基本管理器
Django manger 是 django 模型通過其查詢資料庫的介面。大多數 django 查詢中使用的 objects
欄位實際上是 django 為我們建立的預設管理器(僅當我們不定義自定義管理器時才會建立)。
我們為什麼要定義自定義管理器/查詢集?
避免在我們的程式碼庫中編寫常見查詢,而是使用更容易記住的抽象來引用它們。示例:確定哪個版本更具可讀性:
- 只獲得所有活躍使用者:
User.objects.filter(is_active=True)
vsUser.manager.active()
- 讓所有活躍的面板科醫生參與我們的平臺:
User.objects.filter(is_active=True).filter(is_doctor=True).filter(specialization='Dermatology')
vsUser.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
了。