Django 自定义QuerySet方法实现之间的差异

Django 自定义QuerySet方法实现之间的差异,django,django-models,django-managers,Django,Django Models,Django Managers,阅读djangodocs中有关管理者的内容,我对定制QuerySet方法的不同实现感兴趣 所以,我举了一些例子。 第一个实现如中所示: 然后在模型中: objects = ProductQuerySet.as_manager() objects = VolumeManager() 第二个简单实现: class VolumeManager(models.Manager): def small(self): return self.filter(volume__lt=1

阅读djangodocs中有关管理者的内容,我对定制
QuerySet
方法的不同实现感兴趣

所以,我举了一些例子。 第一个实现如中所示:

然后在模型中:

 objects = ProductQuerySet.as_manager()
objects = VolumeManager()
第二个简单实现:

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

    def large(self):
        return self.filter(volume__gt=4)
在模型中:

 objects = ProductQuerySet.as_manager()
objects = VolumeManager()

他们之间有什么区别吗?或者第一个实现是否有特殊用途?我认为第二个实现更简单、更清晰。

您的第二个实现是不可链接的,我的意思是您不能使用Volume.objects.small().large()。我理解在您的示例中这毫无意义,但在许多实现中,您希望链接自定义筛选方法

您可以在第一个示例中使用queryset作为管理器来实现这一点。在添加“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”方法是一个很好的快捷方式,可以避免这种代码重复和冗长。我相信它的灵感来自于提供类似功能的

您的第二个实现是不可链接的,我的意思是您不能使用Volume.objects.small().large()。我理解在您的示例中这毫无意义,但在许多实现中,您希望链接自定义筛选方法

您可以在第一个示例中使用queryset作为管理器来实现这一点。在添加“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”方法是一个很好的快捷方式,可以避免这种代码重复和冗长。我相信它的灵感来自于提供类似功能的

您的第二个实现是不可链接的,我的意思是您不能使用Volume.objects.small().large()。我理解在您的示例中这毫无意义,但在许多实现中,您希望链接自定义筛选方法

您可以在第一个示例中使用queryset作为管理器来实现这一点。在添加“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”方法是一个很好的快捷方式,可以避免这种代码重复和冗长。我相信它的灵感来自于提供类似功能的

您的第二个实现是不可链接的,我的意思是您不能使用Volume.objects.small().large()。我理解在您的示例中这毫无意义,但在许多实现中,您希望链接自定义筛选方法

您可以在第一个示例中使用queryset作为管理器来实现这一点。在添加“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”方法是一个很好的快捷方式,可以避免这种代码重复和冗长。我相信它的灵感来自于提供类似功能的