使用通用的APIView根据不同的条件使用不同的序列化器

2024-09-28 01:30:58 发布

您现在位置:Python中文网/ 问答频道 /正文

由于根据一定的条件使用不同的序列化程序,我更喜欢使用APIView和override get函数。我对APIView很满意,但现在我需要分页功能,所以我很难做到这一点。这就是为什么我想切换到GenericAPIView,但是由于使用了多个序列化程序,我不知道如何才能做到这一点。在

class ItemsAPIView(APIView):
    permission_classes = (permissions.IsAuthenticated,)
    pagination_class = api_settings.DEFAULT_PAGINATION_CLASS

    def get(self, request, format=None):
        """
        Return a list of all devices of this user.
        """
        reply = {}
        try:
            products = BaseItem.objects.owned_items().filter(owner=request.user)
            reply['data'] = OwnedItemSerializer(products, many=True).data

            items = BaseItem.objects.dev_items().filter(owner=request.user)
            reply['data'].extend(ItemSerializer(items, many=True).data)

        except:
            reply['data'] = []
        return Response(reply, status.HTTP_200_OK)

更新

我试过的另一种方法是

^{pr2}$

没有任何办法奏效。我哪里做错了?在


Tags: of程序dataget序列化objectsrequestitems
2条回答

这就像导入paginator并在apieview中手动调用它一样简单。在

class PollView(views.APIView):
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication,)
paginator = CustomPagination()

def get(self, request):
    queryset = Poll.objects.all()
    context = self.paginator.paginate_queryset(queryset, request)
    serializer = PollSerializer(context, many=True)
    return self.paginator.get_paginated_response(serializer.data)

注意:自定义类不是必需的,您只需从rest导入即可_框架.分页在你剧本的顶端。我创建了一个CustomPagination类,继承自PageNumberPagination,这样就可以按照docs-http://www.django-rest-framework.org/api-guide/pagination/设置页面大小查询

你真的需要两个序列化程序吗?
我认为将单个序列化程序与自定义to_representation一起使用可能是一个更好的选择:

class ItemSerializer(ModelSerializer):
   # Your fields

   def to_representation(self, instance):
       data = super(ItemSerializer, self).to_representation(instance)
       request = self.context.get('request')
       if request and instance.is_owned_by(request.user):
           return self.owner_to_representation(data, instance) # TO IMPLEMENT
       return data

然后,您可以使用一个通用视图。您的代码更干净、更简单,而且不必担心分页:

^{pr2}$

相关问题 更多 >

    热门问题