programing

Django REST Framework에서 커스텀 JSON을 반환하는 방법

javamemo 2023. 3. 1. 08:47
반응형

Django REST Framework에서 커스텀 JSON을 반환하는 방법

커스텀 json을 반환하려고 합니다.get_queryset하지만 항상 얻을 수 있다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 데이터로 정확한 답변을 드리겠습니다.내가 뭘 잘못하고 있지?

Model View가 필요 없는 경우GET 요구에 대해 커스텀 JSON을 설정하고 싶다.

모델을 필요로 하지 않는를 사용할 수도 있습니다.

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

그리고.

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

Model View 사용 시세트

커스텀 JSON을 get_queryset에 넣었습니다.틀렸습니다.를 사용하는 경우ModelViewSet이것만으로 충분합니다.

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'})

Model View를 사용하여 클래스 기반 뷰에서 응답을 커스터마이즈하는 방법은 두 가지가 있습니다.세트

해결책 1:의 커스텀.화이

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

언급URL : https://stackoverflow.com/questions/35019030/how-to-return-custom-json-in-django-rest-framework

반응형