인프런 커뮤니티 질문&답변

조해피님의 프로필 이미지

작성한 질문수

Django REST Framework 핵심사항

Nested Serializer

CateTagSerializer 질문입니다!

해결된 질문

22.08.11 01:02 작성

·

257

3

안녕하세요 좋은 강의 정말 잘 듣고있습니다 감사합니다.
 
 
 

위 코드에서 CateTagSerializer를 nested Serializer로 정의한것 까지는 이해가 되는데요! CateTagSeralizer를 사용할 때, Category와 Tag에서 name만 가져오는게 CategorySerilizer와 TagSerializer를 사용하는것으로 보입니다.

CateTagSerializer에서는 CategorySerializer와 TagSerializer를 써주지 않았는데 어떤 로직에 의해서, 사용하는건지 이해가 되지 않습니다 ㅠㅠ

답변 3

2

김석훈님의 프로필 이미지
김석훈
지식공유자

2022. 08. 11. 20:26

Serializer 처리 과정에서, cateList 의 item 이 CharField 타입이므로, 여기 소스를 보면

class CharField(Field):
    . . .
    def to_representation(self, value):
        return str(value)

value 에 Category 객체가 들어가고, 이를 str(~)으로 형 변환하면,

아래 models.py 의 Category 모델 정의에서, self.name 이 반환됩니다.

class Category(models.Model):
    . . .
    def __str__(self):
        return self.name

이 두가지에 의해 Category 모델의 name 필드가 출력되는 것 입니다.

열공하세요~~

 

 

조해피님의 프로필 이미지
조해피
질문자

2022. 08. 11. 21:23

아 이해되었습니다!! CategorySerializer와 TagSerializer때문이 아니고, Category와 Tag의 __str__이 self.name을 반환하기 때문이였군요! 정말 감사합니다!! ㅎㅎ

2

김석훈님의 프로필 이미지
김석훈
지식공유자

2022. 08. 11. 06:32

안녕하세요. 독자님.

CateTagSerializer 를 만드는 방법 2가지를 설명하였고 그 중 하나만 사용하면 됩니다.

1) netsted 방법 : 위 사진에서 코멘트 처리된 3 라인

2) ListField 사용하는 방법 : nested 방법이 아니고, 직접 필드를 정의하는 방법

 

질문은, 2)번 방법에서, 어떻게 Category 와 Tag 데이터를 가져왔느냐 ? 라고 이해했습니다.

cateList 필드는 ListField 이므로 [item, item, ...] 으로 표현될 것이고,

item의 타입은 CharField 즉 str 타입입니다. 여기서는 타입만 정의한 것이고,

그 값 즉 item 은 views.py 에서 CateTagSerializer 인스턴스를 만들때 넣어줍니다.

 

class CateTagAPIView(APIView):
    def get(self, request, *args, **kwargs):
        . . .
        serializer = CateTagSerializer(instance=data)

 

위 문장에서, data 에 들어있는 cateList 를 Key 로 해서, Category 테이블 데이터를

CateTagSerilaizer 의 cateList 필드의 item 으로 넣어주는 것입니다.

답변이 되었는지요 ?

0

조해피님의 프로필 이미지
조해피
질문자

2022. 08. 11. 09:42

답변 감사드립니다! 

ListField를 사용하는 2번 방법에서, Category모델과 Tag모델의 name 필드만 가져오는 로직이 궁금합니다.

 

특히, CateTagSerializer는 CategorySerializer와 TagSerializer를 상속받지 않았는데, 어떻게 name 필드만 가져오는지 이해가 되지 않네요 ㅠㅠ