阅读关于管理者的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()
它们之间有什么区别吗?或者首次实施是否有任何特殊用途?我认为第二次实施更容易和清晰。
答案 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