장고 기본 View에서의 HttpResponse JSON 응답
모든 View는 HttpResponse 타입의 응답을 해야만 한다
장고 기본에서 HttpResponse JSON응답을 할 수 있는 2가지 종류가 있다
- 직접 json.dumps 를 통해 직렬화된 문자열을 획득하여 HttpResponse를 통해 응답
- 위의 과정을 합쳐 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'
]