DRF & Django

[DRF] Serializers ๊ฐœ๋…

UnoCoding 2022. 8. 8. 19:11

๐Ÿง™  ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ DRF์˜ Serializers ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์•„ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ฐธ๊ณ ๋กœ ๋ชจ๋“  ๋‚ด์šฉ์€ https://www.django-rest-framework.org/api-guide/serializers/ ํŽ˜์ด์ง€์— ๋‹ค ์žˆ์Šต๋‹ˆ๋‹ค. 

 

โœ… DRF์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์€ ๊ฐ„๋žตํ•˜๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 3๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด ์ง‘๋‹ˆ๋‹ค.

 

1. data๋ฅผ DB๋กœ ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ๋‹ค.

2. Serialize ํ•ฉ๋‹ˆ๋‹ค.

3. ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ responseํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” 2๋ฒˆ "Serialize ํ•ฉ๋‹ˆ๋‹ค."๋ฅผ ๋ถ„์„ ํŒŒ์•…์„ ํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์•„๋ž˜์™€ ๊ฐ™์ดmodels์™€ Serializer์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

โœ Comment / models.py

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, blank=True, null=True)
    content = models.TextField('CONTENT')
    create_dt = models.DateTimeField('CREATE DT', auto_now_add=True)
    update_dt = models.DateTimeField('UPDATE DT', auto_now=True)

 ์—ฌ๊ธฐ  Country๋ผ๋Š” ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ Comment  / serializers.py

class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = '__all__'

๊ทธ๋ฆฌ๊ณ  CommentSerializer๋ฅผ ModelSerializer๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

Comment.objects.all()
<QuerySet [<Comment: ์ฒซ๋ฒˆ์งธ ๋Œ“๊ธ€ ์ž…๋‹ˆ๋‹ค>, <Comment: ๋‘๋ฒˆ์งธ ๋Œ“๊ธ€ ์ž…๋‹ˆ๋‹ค>,
    <Comment: ๋งˆ์Šคํฌ ๋ฒ—๊ณ  ์šด๋™ํ•˜>, <Comment: ๋Œ“๊ธ€ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ >, 
    <Comment: ์˜ค๋žœ๋งŒ์— ๋‚˜์ดํ‚ค ์šด>, <Comment: CSRF Token>, <Comment: ensure_csr>,
    <Comment: API ๋ฅผ ๋ณด๊ธฐ ์œ„>, <Comment: DRF ๋กœ ๋Œ“๊ธ€ ์ƒ>, <Comment: CreateAPIV>, 
    <Comment: Create for>,<Comment: comment te>, <Comment: ASD>, <Comment: SDF>]>

 

๋จผ์ € Comment๋ฅผ DB๋กœ ๋ถ€ํ„ฐ ์กฐํšŒํ•ด ๋ด…๋‹ˆ๋‹ค.

 

์ดํ›„ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„ ์™€์„œ Serializer์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ‡ ์ง๋ ฌํ™”

c0 = Comment.objects.all()[0]
sr = CommentSerializer(instance=c0)
sr.data
	{'id': 1, 'content': '์ฒซ๋ฒˆ์งธ ๋Œ“๊ธ€ ์ž…๋‹ˆ๋‹ค.', 'create_dt': '2021-07-28T07:06:54.974180', 'update_dt': '2021-07-28T07:06:54.974180', 'post': 3}

 

์œ„ ์ฝ”๋“œ์˜ c0์€ QuerySet ์ž…๋‹ˆ๋‹ค. -> Serializer(instance) ๋„ฃ๊ณ  -> Serializer.data => Ditc ๋ณ€ํ™˜

๊ผญ Serializer๋Š” ๐Ÿคœ Instance์—๋‹ค ๋„ฃ์–ด์•ผ ์ง๋ ฌํ™”๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. 

 

์—ญ์ง๋ ฌํ™”๋ฅผ ํ•  ๋•Œ๋Š” ๋‚˜์ค‘์— ์–ธ๊ธ‰์ด ๋˜์ง€๋งŒ ๐Ÿคœ data์— Dict๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.

 

data = sr.data

type(data)
	rest_framework.utils.serializer_helpers.ReturnDict

Serializer.data๋ฅผ type ํ•จ์ˆ˜์— ๋„ฃ๊ณ  type์„ ์•Œ์•„ ๋ณธ๋‹ค๋ฉด ReturnDict๋ผ๊ณ  ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

ReturnDict๋Š” DRF์—์„œ ๊ธฐ๋Šฅ์„ ์ข€๋” ์ถ”๊ฐ€ํ•œ Dict๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

from rest_framework.renderers import JSONRenderer
JSONRenderer().render(data)
	b'{"id":1,"content":"\xec\xb2\xab\xeb\xb2\x88\xec\xa7\xb8 \xeb\x8c\x93\xea\xb8\x80 \xec\x9e\x85\xeb\x8b\x88\xeb\x8b\xa4.","create_dt":"2021-07-28T07:06:54.974180","update_dt":"2021-07-28T07:06:54.974180","post":3}'  

json0 = JSONRenderer().render(data)

type(json0)
	bytes

 

ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ byte๋ฅผ ๋ณด๋‚ด์•ผ ํ•˜๋ฏ€๋กœ Renderer ํด๋ ˆ์Šค๋ฅผ ๋ฐ›์•„ Python Dict๋ฅผ byte๋กœ ๋ณ€ํ™˜ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ json0์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด์Šต๋‹ˆ๋‹ค.

๐Ÿข์—ญ ์ง๋ ฌํ™”

 

๋ฐ˜๋Œ€๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ byte๋ฅผ ์ฃผ๋Š” ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด Parser๋กœ ํ’€์–ด์„œ JSON์œผ๋กœ ๋ณ€ํ˜• ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

from rest_framework.parsers import JSONParser
from io import BytesIO
data0 = JSONParser().parse(BytesIO(json0)
print(data0)

    {'id': 1,
     'content': '์ฒซ๋ฒˆ์งธ ๋Œ“๊ธ€ ์ž…๋‹ˆ๋‹ค.',
     'create_dt': '2021-07-28T07:06:54.974180',
     'update_dt': '2021-07-28T07:06:54.974180',
     'post': 3}

Byte ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ์—๋Š” BytesIO๋ผ๋Š” ํด๋ ˆ์Šค๋ฅผ ๋ฐ›์•„ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ธ Dict๋ฅผ Serializer๋กœ ๋ฐ”๊ฟ”๋ณด๋Š” ์‹ค์Šต์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

drs = CommentSerializer(data = data0)

drs.is_valid()
Out[26]: True

drs.errors
Out[27]: {}

drs.validated_data
Out[29]: 
OrderedDict([('content', '์ฒซ๋ฒˆ์งธ ๋Œ“๊ธ€ ์ž…๋‹ˆ๋‹ค.'),
             ('post', <Post: ์œ ๋Ÿฝ ์—ฌํ–‰ ์ค‘ ํŒŒ๋ฆฌ ๊ฐœ์„ ๋ฌธ ๋‹ค๋…€ ์™”๋‹ต๋‹ˆ๋‹ค.>)])
             
# ๋ณ€ํ™˜๋œ Dict๋ฅผ Insertํ•˜๊ธฐ
instance = Comment(**drs.validated_data)
instance.save()

is_valid()๋ฅผ ๊ผญ ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” Serializer์— ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•ด ์ฃผ๋Š” ์—ญํ™•์„ ํ•ฉ๋‹ˆ๋‹ค.

errors ํ”„๋กœํ”„ํ‹ฐ๋Š” ์—๋Ÿฌ ๋‚ด์šฉ์„ ๋ฆฌํ„ดํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค.

 

์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ๋๋‚œ ๋ฐ์ดํ„ฐ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž์ฃผ ๋ด์™”๋˜ OrderDict๋กœ ๋ฐ˜ํ™˜์ด ๋ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜๋œ OrderDict๋ฅผ Model.Comment๋กœ ๋ฐ›์•„ Insert๋ฅผ ํ•ด์ฃผ๋ฉด 

 

์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™” ์‹ค์Šต์ด ์ข…๋ฃŒ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

'DRF & Django' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Django] Django์—์„œ ์“ฐ์ด๋Š” Context Manager  (0) 2023.01.31
[DRF] ORM ์ค‘๋ณต ์ œ๊ฑฐ  (0) 2022.03.10
[DRF] Redis vs RabbitMQ and setting  (0) 2022.02.03
[DRF] Redis, Celery ๊ธฐ๋ณธ ์„ธํŒ…  (1) 2022.02.01