如何在detail_route()视图集中应用djngoFilterBackend

时间:2016-08-30 20:36:54

标签: django

我想在视图中使用django过滤器,该视图具有一些其他行为,而不返回视图集检索或列表方法。 我的代码如下:

class ArticleView(ReadOnlyModelViewSet):
    serializer_class = get_serializer_class(Article)
    queryset = Article.objects.all()
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('TYPE',)

    @detail_route()
    def articles(self, request, pk=None):
        some_behaviour()
        return MY QUERYSET (which can or cannot be modified) FILTERED

因此,通过点击/api/articles及其派生,查询集会被正确过滤,如果我返回self.retrieve(请求)(显然),但我无法修改我的查询集。那么我的问题是,在那种情况下应用scjito过滤器需要什么,或者我怎么能告诉他这样做而不是做r equest.query_string.pop(bla bla bla)

谢谢!

1 个答案:

答案 0 :(得分:0)

我最近遇到了类似的问题。

我发现ViewSet.filter_queryset()函数正是这样做的。

请注意,ViewSet.get_object()也使用self.filer_queryset(),因此请使用detailed_route方法使用get_object_by_pk()

class ViewSet:
    def get_object_by_pk(self, pk):
        return self.get_queryset().get(pk=pk)

    @detail_route():
    def something(self, request, pk):
        object = self.get_object_by_pk(pk)
        queryset = object.whatevet_set
        page = self.paginate_queryset(self.filter_queryset(queryset))

        if page is not None:
            serializer = SerializerClass(page, many=True, context={'request': request})
            return self.get_paginated_response(serializer.data)
        serializer = SerializerClass(queryset, many=True, context={'request': request})
        return Response(serializer.data)