DRF serializer 추가) nested field, method field
지난 글에서 Serializer의 기본 개념을 다루었으나, 이번 글에서는 실제 프로젝트에서 모델 간의 관계가 복잡하고, 요구사항이 다양한 경우에 대처하기 위한 고급 기능을 소개하고자 한다. 이에 대해 Nested fields와 Method fields라는 두 가지 방법을 활용하여 Serializer를 더욱 풍부하고 유연하게 만드는 방법을 알아볼 것이다.
1. Nested Field.
Nested field는 하나의 serializer 안에 다른 serializer를 중첩하여 포함하는 것을 말한다. 이를 통해 여러 개의 작은 serializer를 사용하여 하나의 통합된 serializer를 구성할 수 있다.
from rest_framework import serializers
from .models import Author, Book
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = ('name',)
class BookSerializer(serializers.ModelSerializer):
author = AuthorSerializer()
class Meta:
model = Book
fields = ('title', 'author')
위 예제에서는 BookSerializer 내에 AuthorSerializer를 사용하여 author 정보를 포함하였다. 사실 간단한건데 이렇게 쓸 수 있다는 걸 전혀 생각하지 못했다. 만약 여러 개의 객체를 가져오려면, many=True 옵션을 사용해야 한다.
2. Method Field
Method field를 사용하면, 사용자 정의 메소드를 통해 새로운 필드를 생성할 수 있다. 이 방법은 복잡한 로직을 통해 값을 가져오거나 새로운 필드를 생성해야 할 때 유용하다. get_<생성하는 필드명> 형태의 메서드를 추가적으로 작성하기만 하면 된다.
from rest_framework import serializers
from .models import Author, Book
class BookSerializer(serializers.ModelSerializer):
full_title = serializers.SerializerMethodField()
class Meta:
model = Book
fields = ('title', 'author', 'full_title')
def get_full_title(self, obj):
return f"{obj.title} by {obj.author.name}"
get_full_title(self, obj) 메소드를 사용하여 full_title 필드를 생성하였다. 여기서 obj는 해당 메소드가 처리하는 모델 인스턴스를 나타낸다. 이렇게 생성한 필드는 Meta안에 포함시켜야 오류가 나지 않는다.
복수의 이미지를 업로드하려면 어떻게 해야할까... 생각을 하고 있었는데 꽤 괜찮은 영감을 얻게되었다. 역시 아는 만큼 보이고 아는 것이 힘이다. 더욱 깔끔하게 코드를 작성할 수 있게 되었다.
https://www.django-rest-framework.org/api-guide/relations/
Serializer relations - Django REST framework
relations.py Data structures, not algorithms, are central to programming. — Rob Pike Relational fields are used to represent model relationships. They can be applied to ForeignKey, ManyToManyField and OneToOneField relationships, as well as to reverse re
www.django-rest-framework.org