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