使用 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
了。