-
Serializer를 통해서 특정 모델에 존재하지 않지만, 관계 있는 테이블의 필드 레코드를 반환하는 방법에 대해서 설명하시오
Serializer에서 SerializerMethodField를 이용하여 메서드를 선언해주면 됩니다.
예를 들어 유저와 게시글 모델을 만들어보겠습니다.
from django.db import models class User(models.Model): name = models.CharField(max_length=20) class Article(models.Model): title = models.CharField(max_length=200) user = models.ForeignKey(User, on_delete=models.CASCADE) content = models.TextField()
다음 시리얼라이저를 생성합니다.
from rest_framework import serializers from .models import Article class ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article fields = '__all__'
이렇게 작성하면, 게시글 모델의 모든 필드를 불러옵니다. 하지만 작성자의 정보는 id 값으로만 불러오게 됩니다.
SerializerMethodField를 추가해보겠습니다.
from rest_framework import serializers from .models import Article class ArticleSerializer(serializers.ModelSerializer): user_name = serializers.SerializerMethodField() class Meta: model = Article fields = '__all__' def get_user_name(self, obj): return obj.user.name
이렇게 SerializerMethodField를 추가해서 시리얼라이저에서 작성자의 이름을 함께 담을 수 있습니다.
Serializer를 통해서 역참조 하는 방법에 대해서 설명하시오
Serializer에서 다른 Serializer를 필드로 만들어주면 됩니다.
위의 예시를 이용하겠습니다. 유저가 작성한 게시글을 불러와보겠습니다.
from rest_framework import serializers from .models import Article class ArticleSerializer(serializers.ModelSerializer): user_name = serializers.SerializerMethodField() class Meta: model = Article fields = '__all__' def get_user_name(self, obj): return obj.user.name class UserSerializer(serializers.ModelSerializer): article = ArticleSerializer(many=True) class Meta: model = User fields = '__all__'
UserSerializer에서 article = ArticleSerializer(many=True)로 다른 시리얼라이저를 불러왔습니다.
이렇게 유저가 작성한 게시글들을 게시글 시리얼라이저에 담아서 불러올 수 있습니다.