将项目添加到ListAPIView

问题描述 投票:2回答:4

我有具有指定模型和序列化程序类的普通ListAPIView。我需要在列表末尾添加一个附加项。此项目应手动创建(无查询集),并且应具有与其他项目相同的结构。

django django-rest-framework
4个回答
4
投票

您可以为此重写list方法:

from rest_framework.response import Response

class YoourView(generics.ListAPIView):

    def list(self, request):
        queryset = self.get_queryset()
        serializer = UserSerializer(queryset, many=True)

        # append serializer's data with some additional value
        response_list = serializer.data 
        response_list.append(some_value)
        return Response(response_list)

2
投票

尝试一下,

from rest_framework import generics
from rest_framework.response import Response


class MyListView(generics.ListAPIView):
    serializer_class = MySerializer
    queryset = MyModel.objects.all()

    def list(self, request, *args, **kwargs):
        response_list = list(super().list(request, *args, **kwargs))
        custom_dict = {
            "key_1": "value 1",
            "key_2": "value 2"
        }
        response_list.append(custom_dict)
        return Response(data=response_list)

1
投票

我认为最好保留get_querysetfilter_querysetget_serializer功能,以防您修改serializer_class而不是使用默认的serializer_class

class YourView(ListAPIView):
    queryset = DefaultQueryset
    serializer_class = DefaultSerializer

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

0
投票

我建议您将实际负载与要传递的额外数据分开。这样一来,当您以后遍历那些冲突时,将有助于您避免很多冲突。

尝试一下:

class YourView(ListAPIView):
    queryset = YourModel.objects.all()
    serializer_class = YourSerializer

def list(self, request, args, **kwargs):
    serializer = self.get_serializer(self.get_queryset(), many=True)
    load = serializer.data
    newdict = {'your_new_data': 666}
    response_list = {'load': load, 'extra': newdict}
    return Response(response_list)
© www.soinside.com 2019 - 2024. All rights reserved.