Nested Serialize: serialize 안의 serialize.
ListField: 개체 목록의 유효성을 검사하는 필드 클래스.
# model.py
class Post(models.Model):
category = models.ForeignKey('Category', on_delete=models.SET_NULL, blank=True, null=True)
tags = models.ManyToManyField('Tag', blank=True)
.
.
.
def __str__(self):
return self.title
class Category(models.Model):
name = models.CharField(max_length=50, unique=True)
def __str__(self):
return self.name
class Tag(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
# views.py
class CateTagAPIView(APIView):
def get(self, request, *args, **kwargs):
cateList = Category.objects.all()
tagList = Tag.objects.all()
data = {
'cateList' : cateList,
'tagList' : tagList
}
serializer = CateTagSerializer(instance=data)
return Response(serializer.data)
Serialize도 field 타입 중의 하나이므로 Serialize 속에 field 타입으로 들어갈 수 있다. 이를 nested serialize라고 한다. many=True
옵션을 추가하면 item의 list를 표현 할 수 있다.
# serializes.py
# 직접 필드를 정의할거니 ModelSerializer가 아닌 Serialize 사용
class CateTagSerializer(serializers.Serializer):
cateList = CategorySerializer(many=True)
tagList = TagSerializer(many=True)
리스트가 나오긴 하지만 name 객체도 같이 들어있어 깔끔하지가 않다. 객체 없이 값만 나오게 하고 싶다.
List의 각 원소는 child 인자로 표현한다.
# serializers.py
# 직접 필드를 정의할거니 ModelSerializer가 아닌 Serialize 사용
class CateTagSerializer(serializers.Serializer):
cateList = serializers.ListField(child=serializers.CharField())
tagList = serializers.ListField(child=serializers.CharField())
성공. List 필드 속에 Char 필드로 표시된다.