[DRF] Serializer

GreenBeanยท2021๋…„ 9์›” 27์ผ
0
post-thumbnail

Serializer

Serializer

serializer = PostSerializer(post)
serializer = PostSerializer(data=request.data)
serializer = PostSerializer(post, data=reqeust.data)
serializer = PostSerializer(post, reqeust.data)
serializer = PostSerializer(reqeust.data) # Error
  • PostSerializer๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ 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.Serializer

# 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.ModelSerializer

# 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์œผ๋กœ ํ•ด๋‹น ํ•„๋“œ๊ฐ’์— ๋Œ€ํ•ด ์ •์˜ํ•˜๋Š” ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ์Œ
      • default๋กœ๋Š” 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'
        )
  • Review ๋ชจ๋ธ์€ User ๋ชจ๋ธ๊ณผ ForeignKey๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ
    • user์˜ id ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— serializer๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด id ๊ฐ’์ด ์กฐํšŒ๋จ
      • id ๊ฐ’์œผ๋กœ user์˜ ์ด๋ฆ„์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€
    • get_username์„ ํ†ตํ•ด username์˜ ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ๋ฉฐ obj ์œผ๋กœ๋Š” ํ•ด๋‹น ๋ชจ๋ธ์˜ obj๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋จ
    • ๋งˆ์ง€๋ง‰์œผ๋กœ fields์— ํฌํ•จํ•ด์ฃผ๋ฉด ํ•ด๋‹น ๊ฐ’์ด serializer ์กฐํšŒ ์‹œ ํ•จ๊ป˜ returnํ•˜๊ฒŒ ๋จ

serializer.save()

serializer.save()๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด **kwargs๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์Œ

def save(self, **kwargs):
    pass
  • ์ด ๊ฒฝ์šฐ ์œ ํšจ์„ฑ์„ ํ†ต๊ณผํ•œ validated_data์™€ kwargs dict๊ฐ€ ํ•ฉ์ณ์ ธ์„œ DB์— ์ €์žฅ๋จ

  • ์ด ๋•Œ, self.instance ๊ฐ’์— ๋”ฐ๋ผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฆ„

    • self.instance ๊ฐ’์ด ์—†์„ ๋•Œ: create()๋ฅผ ํ†ตํ•ด ์ €์žฅ
    • self.instance ๊ฐ’์ด ์žˆ์„ ๋•Œ: update()๋ฅผ ํ†ตํ•ด ์ €์žฅ
profile
๐ŸŒฑ Backend-Dev | hwaya2828@gmail.com

0๊ฐœ์˜ ๋Œ“๊ธ€