如果QuerySet和get_queryset都在从GenericViewSet继承的Django视图集中定义,会发生什



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

有一个配置的视图,该视图从genericViewSet继承。在类中,它定义了queryset变量,但也定义了get_queryset方法。我正在努力从文档和教程中锻炼,这甚至意味着什么?更有趣的是get_queryset方法返回一种类型的QuerySet,但是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()

get_querysetself.queryset的用法不同。self.queryset的定义用于确定路由器URL定义中视图的BASENAME(请参阅以下内容:http://www.django-rest-framework.org/api-guide/routers/routers/#usage)t提供一个QuerySet作为视图的属性DRF将在路由器中引起错误。

在您的特定情况下(从源代码段显示的内容)中,queryset如果在其他任何地方都没有使用(无法根据此片段确定)!

我对重构的建议,以简化可读性和清晰的内容是在QuerySet中为您在get_queryset方法中使用的过滤器中创建一种自定义方法,我将完全删除queryset在您的其余代码上),因为下一个编码器将需要像理解它一样挖掘代码。

编码约为80%读取20%的编码,并且始终比您发现的代码更好(〜干净的代码,Robertc。Martin)。

viewets中的 get_queryset方法的要点是

的行
def get_queryset(self):
    return self.queryset

由于您已经覆盖了get_queryset方法并调用super,因此您正在更改结果。

这可能对其他任何人都没有用,但是对于完整性,我正在回答。

的确,querysetget_queryset查询组都合并了。看起来get_queryset呼叫super(FeedbackFieldViewSet, self).get_queryset()获取QuerySet值(CustomField.objects.all()),然后list(chain(queryset, FeedBackField,objects.all()))是组合两个QuerySets的方法。

我的错误是与分页有关,即缺少值是因为缺少的值是因为它们不在结果的第一页上。

相关内容

  • 没有找到相关文章

最新更新