簡體   English   中英

如何在Django REST Framework中返回自定義JSON

[英]How to return custom JSON in Django REST Framework

我正在嘗試使用get_queryset返回自定義json,但始終會收到404 error

class TestViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Test.objects.all()
    serializer_class = TestSerializer

    def get_queryset(self):
        if self.request.method == "GET":
            content = {'user_count': '2'}
            return HttpResponse(json.dumps(content), content_type='application/json')

如果刪除從def開始的所有內容,我將獲得標准json數據的正確響應。 我做錯了什么?

如果您不需要ModelViewSet而只想在GET請求上使用自定義JSON

您還可以使用不需要模型的APIView

class MyOwnView(APIView):
    def get(self, request):
        return Response({'some': 'data'})

urlpatterns = [
    url(r'^my-own-view/$', MyOwnView.as_view()),
]

使用ModelViewSet

您已將自定義JSON放入get_queryset中,這是錯誤的。 如果要使用ModelViewSetModelViewSet就足夠了:

class TestViewSet(viewsets.ModelViewSet):
    queryset = Test.objects.all()
    serializer_class = TestSerializer

ModelViewSet帶有.list() .retrieve() .create() .update().destroy()默認實現。 哪些可供您根據需要覆蓋(自定義)

返回從自定義JSON .retrieve()和/或.list()ModelViewSet

例如,重寫.retrieve()以在檢索單個對象時返回自定義視圖。 我們可以看一下默認實現,如下所示

def retrieve(self, request, *args, **kwargs):
    instance = self.get_object()
    serializer = self.get_serializer(instance)
    return Response(serializer.data)

因此,以返回自定義JSON為例:

class TestViewSet(viewsets.ModelViewSet):
    queryset = Test.objects.all()
    serializer_class = TestSerializer

    def retrieve(self, request, *args, **kwargs):
        return Response({'something': 'my custom JSON'})

    def list(self, request, *args, **kwargs):
        return Response({'something': 'my custom JSON'})

有兩種方法可以使用ModelViewSet基於類的視圖中自定義響應

解決方案1:views.py中自定義

class StoryViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.AllowAny,)
    queryset = Story.objects.all()
    serializer_class = StorySerializer

    def retrieve(self, request, *args, **kwargs):
        # ret = super(StoryViewSet, self).retrieve(request)
        return Response({'key': 'single value'})

    def list(self, request, *args, **kwargs):
        # ret = super(StoryViewSet, self).list(request)
        return Response({'key': 'list value'})

解決方案2:serializers.py中自定義(我推薦此解決方案)

class StorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Story
        fields = "__all__"

    def to_representation(self, instance):
        ret = super(StorySerializer, self).to_representation(instance)
        # check the request is list view or detail view
        is_list_view = isinstance(self.instance, list)
        extra_ret = {'key': 'list value'} if is_list_view else {'key': 'single value'}
        ret.update(extra_ret)
        return ret

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM