Backend/Django

[django-rest-framework] (4) View에서의 JSON 응답

dltjdn 2022. 1. 20. 18:58

 

장고 기본 View에서의 HttpResponse JSON 응답

모든 View는 HttpResponse 타입의 응답을 해야만 한다

장고 기본에서 HttpResponse JSON응답을 할 수 있는 2가지 종류가 있다

  1.  직접 json.dumps 를 통해 직렬화된 문자열을 획득하여 HttpResponse를 통해 응답
  2.  위의 과정을 합쳐 JsonResponse 라는 HttpResponse를 상속받은 클래스 지원 (내부적으로 DjangoJSONEncoder가 디폴트 지정)

 

DRF Response 활용한 HttpResponse JSON 응답

qs = Post.objects.all()

serializer = PostSerializer(qs, many=True)

from rest_framework.response import Response
response = Response(serializer.data)

Response에선 JSON 직렬화가 Lazy하게 동작한다.  실제 응답 생성시에 변환이 이루어진다.

 

 

Response 와 APIView

DRF의 모든 뷰는 APIView 를 상속받는다

Response는 항상 APIView와 함께 쓰인다

APIView를 통해 Response에 다양한 속성이 지정된다

 

실제 DRF Serializer 활용

# views.py
from rest_framework import generics

class PostListAPIView(generics.ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class= PostSerializer



# urls.py
urlpatterns = [
    path('public/', views.PostListAPIView.as_view())
]

 

모델에 FK가 있을때, Serializer에서 활용법

 

author = FK(User) 필드가 있을 때, Serializer 에서는 FK 키값으로 응답한다

필드 값을 읽어오기 위해 두 가지 방법 사용할 수 있다

 

(1) serializer.ReadOnlyField 사용

# serializers.py

from pdb import post_mortem
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    author_email = serializers.ReadOnlyField(source='author.email')

    class Meta:
        model = Post
        fields = [
            'pk', 
            'author_email', 
            'title',
            'content'
        ]

 

(2) 중첩된 Serializer을 통해 구현

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = ['username', 'email']


class PostSerializer(serializers.ModelSerializer):
    author = AuthorSerializer()

    class Meta:
        model = Post
        fields = [
            'pk', 
            'author', 
            'title',
            'content'
        ]