美文网首页django
django-model之定义查询集API

django-model之定义查询集API

作者: 陆_志东 | 来源:发表于2018-08-26 20:21 被阅读34次

下面的这个例子允许你直接从自定义的管理器Person.people 中调用authors() 和editors()。
注意Person.objects 也可以调用authors() 和editors()。因为定义的方法会被复制到管理器
文章最下面有复制的原则,哪些方法会被允许复制,如果你不想允许复制到管理器,请查看文章最下面
因为objects 是 models.Manager() 的实例,并没有添加authors() 和editors()方法

class PersonQuerySet(models.QuerySet):
    def authors(self):
        return self.filter(role='A')

    def editors(self):
        return self.filter(role='E')

class PersonManager(models.Manager):
    def get_queryset(self):
        return PersonQuerySet(self.model, using=self._db)

    def authors(self):
        return self.get_queryset().authors()

    def editors(self):
        return self.get_queryset().editors()

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    role = models.CharField(max_length=1, choices=(('A', _('Author')), ('E', _('Editor'))))
    objects = models.Manager()
    people = PersonManager()

上面的实例可以通过QuerySet.as_manager()方法来简化
通过QuerySet.as_manager()创建的管理器 实例,实际上等价于上面例子中的PersonManager。

class PersonQuerySet(models.QuerySet):
    def authors(self):
        return self.filter(role='A')

    def editors(self):
        return self.filter(role='E')


class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    role = models.CharField(max_length=1, choices=(('A', _('Author')), ('E', _('Editor'))))
    objects = models.Manager()
    people = PersonQuerySet.as_manager()

注意:并不是每个查询集的方法都在管理器层面上有意义
方法复制到管理器的原则:

  • 公共方法默认被复制。
  • 私有方法(前面带一个下划线)默认不被复制。
  • 带queryset_only 属性,并且值为False的方法总是被复制。
  • 带 queryset_only 属性,并且值为True 的方法不会被复制。
class CustomQuerySet(models.QuerySet):
    # Available on both Manager and QuerySet.  在Manager和QuerySet上都可用。
    def public_method(self):
        return

    # Available only on QuerySet. 只在QuerySet可用。
    def _private_method(self):
        return

    # Available only on QuerySet. 只在QuerySet可用。
    def opted_out_public_method(self):
        return
    opted_out_public_method.queryset_only = True

    # Available on both Manager and QuerySet.  在Manager和QuerySet上都可用。
    def _opted_in_private_method(self):
        return
    _opted_in_private_method.queryset_only = False

相关文章

网友评论

    本文标题:django-model之定义查询集API

    本文链接:https://www.haomeiwen.com/subject/hrbuiftx.html