JSON ์๋ต
๐ก View์์ JSON์๋ต
๋ชจ๋ View๋ HttpResponse ํ์ ์ ์๋ต์ ํด์ผํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์๋์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
-
์ง์ json.dumps๋ฅผ ํตํด ์ง๋ ฌํ๋ ๋ฌธ์์ด์ ํ๋ํ์ฌ HttpResponse๋ฅผ ํตํด ์๋ต
-
JsonResponse(HttpResponse๋ฅผ ์์ ๋ฐ์ ํด๋์ค) ์ฌ์ฉ
-
๋ด๋ถ์ ์ผ๋ก json.dumps๋ฅผ ์ฌ์ฉ
-
DjangoJSONEncode๊ฐ defualt๋ก ์ง์
-
๊ทธ๋ฆฌ๊ณ JsonResponse์์ QuerySet์ JSON ์ง๋ ฌํ๋ฅผ ํ ์ ์๋ค.
๋ฐ๋ผ์ ์์์ ์ ์ํ๋ MyJSONEncoder๋ฅผ ํ์ฉํ ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
qs = Post.objects.all()
encoder = MyJSONEncoder
# True: data๊ฐ dict์ผ ๊ฒฝ์ฐ
# False: data๊ฐ dict์ผ ์๋ ๊ฒฝ์ฐ
safe = False
json_dumps_params = {'ensure_ascii':False}
# HttpResponse์ ์ ํด์ง๋ Keyword ์ธ์
kwargw = {}
from Djagno.http import JsonResponse
responser = JsonResponse(qs, encorder, safe, json_dumps_params, **kwargs)
๐ก DRF๋ฅผ ํตํ JSON์๋ต
1
2
3
4
5
6
qs = Post.objects.all()
serializer = PostSerializer(qs, many=True)
from rest_framework.responser import Response
responser = Responser(serializer.data) # content-type : text/html ๋ํดํธ ์ง์
Response์๋ ๋ด๋ถ์ ์ผ๋ก ๋ค์ํ DRF ์ค์ ๋ค์ด ์๋ค.
๋ฐ๋ผ์ Response์์๋ โJSON ์ง๋ ฌํโ๊ฐ Lazyํ๊ฒ ๋์ํ๋ค.
์ค์ ์๋ต ์์ฑ ์์๋ .rendered_content ์์ฑ์ ์ ๊ทผํ๋ฉฐ, ์ด๋ ๋ณํ์ด ์ด๋ฃจ์ด์ง๋ค.
Response์ APIView
DRF์ ๋ชจ๋ View๋ APIView๋ฅผ ์์ ๋ฐ๋๋ค.
APIView๋ฅผ ํตํด Response์ ๋ค์ํ ์์ฑ์ด ์ง์ ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from rest_framework.views import APIView
renderer_cls = APIView.renderer_classes[0]
renderer_obj = renderer_cls()
# JSON ๋ณํ์ ์ํ JSONRenderer ์ธ์คํด์ค
response.accepted_renderer = renderer_obj
response.accepted_media_type = renderer_obj.media_type # 'application/json'
response.renderer_context = {'view': None, 'args': (), 'kwargs': {}, 'request': None}
response
# <Response status_code=200, "application/json">
๐ก ์ค์ DRF Serializer ํ์ฉ
์๋์ ๊ฐ์ด ๊ฐ๊ฒฐํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
1
2
3
4
5
6
7
8
from rest_framework import generics
class PostListAPIView(generics.ListAPIView):
queryset = Post.objects.all()
serializer_class = PostModelSerializer
post_list = PostListAPIView.as_view()
ListAPIView๋ ์ค์ง list ๊ธฐ๋ฅ๋ง์ ํ๋ค.
ListCreateAPIView๋ list + Create ๊ธฐ๋ฅ์ ํ๋ค.
์ถ๊ฐ์ ์ผ๋ก ModelViewSet์ CRUD๋ฅผ ๋ชจ๋ ์ง์ํ๋๋ฐ,
ModelViewSet์ ์ฌ์ฉํ ๊ฒฝ์ฐ urls.py์์ router๋ฅผ ๊ผญ ์ค์ ํด์ค์ผ ํ๋ค.
ํฌ์คํ ์กฐํ ์๋ต์ username ์๋ตํ๊ธฐ.
๏ผ. ReadOnlyField ํ์ฉ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# serializers.py
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
username = serializers.ReadOnlyField(source='author.username')
class Meta:
model = Post
fields = [
'pk',
'username',
'message',
'created_at',
'updated_at'
]
๏ผ. Class ์์ ๋ฐฉ์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# serializers.py
from django.contrib.auth import get_user_model
from rest_framework import serializers
from .models import Post
class AuthSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['username','email']
class PostSerialize(serializers.ModelSerializer):
class Meta:
model = Post
fields = [
'pk',
'author',
'message',
'created_at',
'updated_at'
]

