본문 바로가기

Python/Django

[Django] Serializer가 뭐야?

728x90

Django Rest Framework를 사용하면 serializer라는 개념이 새롭게 등장합니다. serializer는 직렬화라는 뜻을 가진 단어입니다. 직렬화에 대한 네이버의 사전적 정의는 다음과 같습니다.

 

공간적으로 동시에 존재하는 상태로 표현되어 있는 데이터를 이것에 대응하는 직렬(시리얼)인 상태로 존재하도록 변환한다라는 의미가 있다.

 

간단하게 말해서 django에 저장되어 있는 모델 인스턴스를 REST API에서 사용하는 JSON의 형태로 바꿔주는 것을 말합니다. 다음은 Serializer를 설명하기 위한 코드입니다.

 

# models.py
class Journalist(models.Model):
    first_name = models.CharField(max_length=60)
    last_name = models.CharField(max_length=60)
    
class Article(models.Model):
    author = models.ForeignKey(Journalist, on_delete=models.CASCADE)
    title = models.CharField(max_length=120)
    description = models.CharField(max_length=120)
    body = models.TextField(max_length=500)
    location = models.CharField(max_length=50)
    publication_date = models.DateField()

    active = models.BooleanField(default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

 

우선 models.py에 가서 Journalist, Article 모델을 만들어줍니다. 이때 Journalist는 기자의 정보를 저장하는 모델이고, Article은 기사를 저장하는 모델입니다.

 

# serializers.py
from rest_framework import serializers
from news.models import Article, Journalist


class ArticleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Article
        exclude = ('id',)


class JournalistSerializer(serializers.ModelSerializer):

    article_set = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='article-detail')

    class Meta:
        model = Journalist
        fields = '__all__'

 

ArticleSerializer는 Article 모델 인스턴스에서 id를 제외한 모든 field의 값을 직렬화하라는 역할을 가진 클래스입니다. JournalistSerialzer는 Journalist 모델 인스턴스에서 모든 field의 값을 직렬화하라는 역할을 가진 클래스입니다.

 

article_set은 Journalist를 참조하고 있는 모델의 값을 Hyperlink의 형태로 볼 수 있도록 해주는 값입니다. article_set은 <클래스 이름>_set으로 설정되어 있는 값 입니다. 따라서 다른 값을 사용하고 싶다면 models.py에서 realted_name을 따로 설정해주는 것으로 해결할 수 있습니다. 더 자세한 사항은 다음의 홈페이지를 참고해주세요.

728x90

'Python > Django' 카테고리의 다른 글

[Django] Permission은 뭐야?  (0) 2021.07.15
[Django] Proxy Model은 뭐야?  (0) 2021.07.14
[Django] post_save()는 뭐야?  (0) 2021.07.12
[Django] django-session-timeout은 뭐야?  (0) 2021.07.08
[Django] APIView, api_view가 뭐야?  (0) 2021.07.07