serializer = PostSerializer(post)
serializer = PostSerializer(data=request.data)
serializer = PostSerializer(post, data=reqeust.data)
serializer = PostSerializer(post, reqeust.data)
serializer = PostSerializer(reqeust.data) # Error
post
๋ผ๋ instance๊ฐ ๋จผ์ ๋์จ๋ค๋ฉด ๋ค์ data
๋ผ๋ keyword ๋ฅผ ์จ์ค ํ์๊ฐ ์์ง๋ง, instance ์์ด data
๋ฅผ ๋๊ธฐ๊ธฐ ์ํด์๋ keyword๊ฐ ๊ผญ ํ์data
๊ฐ์ด ์ฃผ์ด์ง๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋จserializer.is_valid()
๊ฐ ํธ์ถ ๋์์ ๋,serializer.initial_data
์ data
๊ฐ์ ๋ฃ์ด์คserializer.validated_data
์ data
๊ฐ์ ๋ฃ์ด์คserializer.save()
๊ฐ ํธ์ถ๋ ๋, data
๊ฐ์ด ์ ์ฅ๋จTip!
serializer.errors
์๋ ์ ํจ์ฑ ๊ฒ์ฌ์์ ๋ฐ์ํ ์ค๋ฅ๊ฐ ์ ์ฅ๋จserializer.data
์๋ ์ ํจ์ฑ ๊ฒ์ฌ์์ ํต๊ณผ๋ ์ธ์คํด์ค ๊ฐ์ด ์ฌ์ ํ์ผ๋ก ์ ์ฅ๋จ
Tip! ๋งค๊ฐ๋ณ์์ ์ธ์
- ๋งค๊ฐ๋ณ์(parameter) : ํจ์์ ์ ๋ ฅ์ผ๋ก ์ ๋ฌ๋ ๊ฐ์ ๋ฐ๋ ๋ณ์
- ์ธ์(arguments) : ํจ์๋ฅผ ํธ์ถํ ๋ ์ ๋ฌํ๋ ์ ๋ ฅ๊ฐ
def add(a, b): return a + b print(add(3, 4)) # ๋งค๊ฐ๋ณ์ : a, b # ์ธ์ : 3, 4
# serializers.py
class ArticleSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
title = serializers.CharField()
body = serializers.CharField()
publication_date = serializers.DateField()
active = serializers.BooleanField()
created_at = serializers.DateTimeField(read_only=True)
updated_at = serializers.DateTimeField(read_only=True)
def create(self, validated_data):
print(validated_data) # create ๋ ๋ ๋ง๋ค print ์คํ๋จ
return Article.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.title = validated_data.get('title', instance.title)
instance.body = validated_data.get('body', instance.body)
instance.publication_date = validated_data.get('publication_data',
instance.publication_date)
instance.active = validated_data.get('active', instance.active)
instance.save()
return instance
def create(self, validated_data): return Article.objects.create(**validated_data)
# serializers.py
class ArticleSerializer(serializers.ModelSerializer):
time_since_publication = serializers.SerializerMethodField()
# author = serializers.StringRelatedField() # String ํ์
์ผ๋ก ๋ฐ์
# author = JournalistSerializer(read_only=True) # Serializer๋ก author๊ฐ ๊ฐ๊ณ ์๋ ์ ์ฒด ๋ฐ์ดํฐ ๋ฐ์
class Meta:
model = Article
fields = "__all__" # ์ ์ฒด field ๊ฐ์ ธ์ด
# fields = ("title", "description", "body") # ์ํ๋ ํน์ field๋ง ๊ฐ์ ธ์ด
# exclude = ("id",) # ํน์ field ์ ์ธ ๊ฐ๋ฅ
def get_time_since_publication(self, object):
publication_date = object.publication_date
now = datetime.now()
time_delta = timesince(publication_date, now)
return time_delta
SerializerMethodField(method_name=None)
SerializerMethodField()
๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ์ปค์คํ
ํ ์ ์์SerializerMethodField()
๋ read-only field ๋ก ๊ฐ์ ์ ์ฅํ๊ฑฐ๋ ์์ ํ ๋๋ ์ฌ์ฉ๋์ง ์๊ณ ์กฐํํ ๋๋ง ์ฌ์ฉmethod_name
์ผ๋ก ํด๋น ํ๋๊ฐ์ ๋ํด ์ ์ํ๋ ํจ์์ ์ด๋ฆ์ ๋๊ฒจ์ค ์ ์์get_<field_name>
๋ก ์ ํด์งget_time_since_publication
time_since_publication = serializers.SerializerMethodField() def get_time_since_publication(self, object): publication_date = object.publication_date now = datetime.now() time_delta = timesince(publication_date, now) return time_delta
Tip! ์ถ๊ฐ ์์
# serializers.py
from rest_framework import serializers as sz
class ReviewSerializer(sz.ModelSerializer):
username = sz.SerializerMethodField()
def get_username(self, obj):
return obj.user.nickname
class Meta:
model = Review
fields = (
'username',
'content',
'created_at'
)
get_username
์ ํตํด username์ ๊ฐ์ ์ง์ ํด์ฃผ๋ฉฐ obj ์ผ๋ก๋ ํด๋น ๋ชจ๋ธ์ obj๊ฐ ๋ค์ด์ค๊ฒ ๋จserializer.save()
๋ ๋ค์๊ณผ ๊ฐ์ด **kwargs
๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์
def save(self, **kwargs):
pass
์ด ๊ฒฝ์ฐ ์ ํจ์ฑ์ ํต๊ณผํ validated_data
์ kwargs
dict๊ฐ ํฉ์ณ์ ธ์ DB์ ์ ์ฅ๋จ
์ด ๋, self.instance ๊ฐ์ ๋ฐ๋ผ ์ ์ฅํ๋ ๋ฐฉ์์ด ๋ค๋ฆ