[DRF]Nested Serialize & ListField

박민하·2022년 9월 26일
0

DRF

목록 보기
3/9
post-thumbnail

Nested Serialize: serialize 안의 serialize.
ListField: 개체 목록의 유효성을 검사하는 필드 클래스.

✅ 목표

  • 카테고리 리스트와 태그 리스트의 name 값을 나타내려고 한다.
  • Nested 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)

1. Nested Serialize

  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 객체도 같이 들어있어 깔끔하지가 않다. 객체 없이 값만 나오게 하고 싶다.

2. ListField

  List의 각 원소는 child 인자로 표현한다.

# serializers.py
# 직접 필드를 정의할거니 ModelSerializer가 아닌 Serialize 사용
class CateTagSerializer(serializers.Serializer): 
    cateList = serializers.ListField(child=serializers.CharField())
    tagList  = serializers.ListField(child=serializers.CharField())

  성공. List 필드 속에 Char 필드로 표시된다.

profile
backend developer 🐌

0개의 댓글