๐ง ์ด๋ฒ ํฌ์คํ ์ 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 |