首页 > 解决方案 > 姜戈 | 休息 | 添加顶级 JSON 字段中断过滤选项

问题描述

我必须工作 ListAPIView 视图,通过它我可以通过 django-filter 值进行过滤。但是我需要在 JSON 中添加一个对象(因为 AMP HTML 需要它),当我添加它时,它会破坏这个过滤。

当我使用这个视图时,过滤效果很好:

class TypeAPIView(generics.ListAPIView):
    permission_classes = (AllowAny, )
    queryset = Type.objects.all()
    serializer_class = TypeSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ('code', )


    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

但是当我想添加一个顶级 JSON 对象时,它会破坏一个过滤选项:

class TypeAPIView(generics.ListAPIView):
    permission_classes = (AllowAny, )
    queryset = Type.objects.all()
    serializer_class = TypeSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ('code', )


def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())
    serializer = self.get_serializer(queryset, many=True)
    # --- modified from here ---
    custom_data = {
        'vehicles': serializer.data
    }
    return Response(custom_data)
    # --- END modified from here ---

是否可以添加顶级 JSON 对象并保持 django-filter 的过滤工作?

谢谢!

标签: djangodjango-rest-frameworkdjango-filter

解决方案


此代码取自 django 源代码:

class ListModelMixin:
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

尝试使用这种格式并从您的终端添加跟踪日志。


推荐阅读