ํฌ์ŠคํŠธ

JSON ์‘๋‹ต

JSON ์‘๋‹ต

๐Ÿ’ก View์—์„œ JSON์‘๋‹ต

๋ชจ๋“  View๋Š” HttpResponse ํƒ€์ž…์˜ ์‘๋‹ต์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์•„๋ž˜์˜ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.


  1. ์ง์ ‘ json.dumps๋ฅผ ํ†ตํ•ด ์ง๋ ฌํ™”๋œ ๋ฌธ์ž์—ด์„ ํš๋“ํ•˜์—ฌ HttpResponse๋ฅผ ํ†ตํ•ด ์‘๋‹ต

  2. 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'
        ]


์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.