自定义QuerySet方法实现的区别

时间:2015-07-23 00:45:55

标签: django django-models django-managers

阅读关于管理者的djangodocs,我对自定义QuerySet方法的不同实现感兴趣。

所以,我给出了我的例子。 第一个实现,如djangodocs

class ProductQuerySet(models.QuerySet):
    def small(self):
        return self.filter(volume__lt=1)

    def large(self):
        return self.filter(volume__gt=4)

然后在模型中:

 objects = ProductQuerySet.as_manager()

第二个简单的实施:

class VolumeManager(models.Manager):
    def small(self):
        return self.filter(volume__lt=1)

    def large(self):
        return self.filter(volume__gt=4)

并在模型中:

objects = VolumeManager()

它们之间有什么区别吗?或者首次实施是否有任何特殊用途?我认为第二次实施更容易和清晰。

1 个答案:

答案 0 :(得分:3)

你的第二个实现是不可链接的,我的意思是你不能去Volume.objects.small()。large()。我理解在你的例子中这没有任何意义,但在许多实现中你想链接自定义过滤器方法。

您可以使用查询集作为管理器的第一个示例执行此操作。在添加'as_manager'之前,您必须复制manager和queryset中的方法以使它们可链接,如下所示:

class ProductMixin(object):
    def small(self):
        return self.filter(volume__lt=1)

    def large(self):
        return self.filter(volume__gt=4)

class ProductQuerySet(QuerySet, ProductMixin):
    pass

class ProductManager(models.Manager, ProductMixin):
    def get_query_set(self):
        return ProductQuerySet(self.model, using=self._db)

正如您所看到的,'as_manager'方法是一种很好的快捷方式,可以避免这种代码重复和冗长。我相信它的灵感来自提供类似功能的PassThroughManager