[drf]airbnb-api -18 SerializerMethodField

Hyeseong·2021년 3월 31일
0
post-thumbnail

'results'키에 새로우 value하나를 추가 해볼게요.
바로 'isOnFavirite'라는 'isOnFavirite: true' 또는 'isOnFavirite: false'를 넣어서 해당 방이 나의 관심목록에 있는지 없는지를 나타내게 되요.

즉, 누가 api/v1/rooms endpoint를 불렀느냐에 따라서 동적으로 데이터를 가져와서 클라이언트에게 줘야되요.

SerializerMethodField

read-only filed라는 점 유의하세요.

그래서 serializers.py파일에 우리가 정의할 시리얼 라이저 클래스의 필드를 정의할게요.
바로 위에 보면 get_days_since_joined()라는 메서드가 정의되어 있조?

따라해야할건 get_??이라는 prefix를 넣어주고 인자값 self와 인스턴스변수로 받을 인자이름을 2번째로 넣고 return할 넣어주면되요.


...
...

def get_am_i_sexy(self, obj):
	print(obj)
    return True

그럼 서버에서 다시 실행해보면 정상적으로 am_i_sexy라는 필드가 출력되요.

콘솔에서 프린트로 찍은 정보를 확인해보면 room에 대한 객체 정보가 멀쩡히 잘 찍혀 나온걸 확인 할 수 있어요.

이름이 이상하니깐. 원래 의도했던 대로 is_fav이라고 변수명을 바꿀게요.

핵심입니다. 그럼 이 방을 누가 보고 있는지 확인해야겠조?

그럼 특정 시리얼 라이저에게 누가 지금 해당 방을 보고 있는지 알려줘야해요.

일반적으로 파이썬에서 request를 통해서 도대체 누가 로그인했는지 유저 정보를 파악하게 됩니다. .user 속성값을 통해서 말이조!

RoomSerializer()클래스에 context={'request':request} 키워드 인자를 넣어서 정보를 결국 알려주는 거에요.

그리고 get_is_fave() 메서드를 아래와 같이 손볼게요. 그럼 로그인한 유저의 정보가 프린트로 찍어보면 콘솔에서 확인할수가 있어요.

최종 로직

결국 다이나믹 필드 구현을 하기위해서 먼저 get_메서드를 사용하고 그 안에 비즈니스 로직을 작성하게되요.
특히 로그인한 유저의 고유한 정보를 알고 싶다면 view에서 context={"?":"} 키워드 인자로 값을 넘겨줘서 request.user속성 값을 넘겨 줄 수 있도록 하는거에요.
그리고 이후 self.context.get()메서드에서 넘겨받은 딕셔너리에서 'request'키를 조회하여 값을 받아오고 is_authenticated 속성값을 통해서 로그인 여부도 확인하게되요. 다음 django ORM을 통해서 in 멤버십 연산자를 통해서 가져온 방의 정보가 현재 로그인 한 유저의 관심 목록 리스트에 있는지 확인하게되요.

profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글