如果queryset和get_queryset都是在继承自GenericViewSet的Django ViewSet上定义的,会发生什么

Mat*_*ows 0 python django django-rest-viewsets

我继承了一些Django代码,我正在努力弄清楚以前的开发人员对他们的代码的意图.

有一个配置的ViewSet,它继承自GenericViewSet.在类中,它定义了一个queryset变量,但也定义了一个get_queryset方法.我正在努力从文档和教程中解决这个甚至意味着什么?更有趣的是该get_queryset方法返回一种类型的查询集,但该queryset变量定义了一种不同的类型.

我希望的是两个查询集合在一起(这是期望的行为,并且似乎发生在一个服务器上,而不是另一个服务器上,因此需要进行一些额外的调查以找出原因)

代码如下:

class FeedbackFieldViewSet(NestedViewSetMixin,
                       customer_mixins.CustomerProviderMixin,
                       mixins.ListModelMixin,
                       viewsets.GenericViewSet):
    ##
    # Instantiates and returns the list of permissions required by this viewset.
    #
    # @return The list of permissions.
    #
    def get_permissions(self):
        # Maps action names to tuples of permission classes.
        permissionDict = {
            "list": self.listPermissionClasses,
        }

        if self.action in permissionDict:
            return [permission() for permission in permissionDict[self.action]]

        if self.request.method == "OPTIONS":
            # Anyone can submit an options request
            return []

        raise ProgrammingException("A request with an unknown permission model was received.")

    listPermissionClasses = (IsFeatureEnabled,)

    ##
    # Overrides the get_queryset method to join the custom feedback fields
    # with the default feedback fields.
    #
    def get_queryset(self):
        queryset = super(FeedbackFieldViewSet, self).get_queryset().filter(
            deleted           = False,
            recordContentType = ContentType.objects.get(
                app_label = "hubpro_api",
                model     = "feedback"))

        return list(chain(queryset, FeedbackField.objects.all()))

    serializer_class = FeedbackFieldSerializer
    feature          = "feedback"
    queryset         = CustomField.objects.all()
Run Code Online (Sandbox Code Playgroud)

小智 5

有不同的用法get_queryset,self.queryset例如self.queryset用于确定路由器URL定义中视图的基本名称的定义(参见注释:http://www.django-rest-framework.org/api-guide/routers/ #usage)如果您不提供查询集作为视图的属性,DRF将在路由器中引发错误.

在您的特定情况下(根据您的源代码段显示)queryset,如果它没有在其他地方使用(根据此代码段无法确定),则没有用处!

我对重构以减轻可读性和清除内容的建议是在查询集中为您在get_queryset方法中使用的过滤器创建一个自定义方法,我将queryset完全删除(如果它的安全取决于您的其余代码),因为下一个编码器需要像你所了解的那样深入挖掘代码.

编码大约80%读取20%编码并且总是让代码比你发现的更好(〜清洁代码,robert c.martin).