이상한 drf

이승연·2022년 2월 11일
0

에러!!!!!!!!

목록 보기
7/7

자 이제 이게 working하는 코드다:

    @action(detail=False, methods=['get', 'patch'])
    def loggedin_user(self, request):
        try:
            serializer = None
            print(self.request.user)
            print(request.method)
            queryset = User.objects.get(email=self.request.user)

            if request.method == "GET":
                serializer = RetrieveAuthenticatedUserSerializer(queryset)
            elif request.method == "PATCH":
                serializer = UpdateUserSerializer(queryset)
            return Response(serializer.data)
        except Exception as e:
            return Response(f"error has occurred: {e}", status=status.HTTP_500_INTERNAL_SERVER_ERROR)

response로

{
    "id": 36,
    "profile_pic": "http://k.kakaocdn.net/dn/91EJJ/btq4Xx7S7Ud/ouewcuQVz3ohtZJ0qVrWgK/img_110x110.jpg",
    "nickname": "이승연",
    "cellphone": "010-6351-0445",
    "email": "hillary0427@naver.com",
    "address": "",
    "address_detail": "상세주소"
}

이 오는게 맞다. 그런데 이게 지금까지 안됐다.

디버깅 과정

  1. methods에 get과 patch를 추가하고 self.action에 따라 serializer를 다르게 실행했다. 그러니 serializer none으로 오고 none에는 당연히 data가 없다. 이건 내가 loggedin_user라는 커스텀 액션을 만들었기 때문에 action에는 retrieve나 partial_update가 없고 무조건 loggedin_user로 액션을 알아듣는 것이다. 그래서 request.method에 따라 serializer를 다르게 할당했고 작동했다.
  2. 두번째 문제는 serializer에 현재 로그인 된 유저를 필터링하여 넣으면 데이터가 오지 않는다는 것. 이건 장고 orm의 filter를 쓰는 대신 get을 사용해서 해결했는데, filter를 넣으면 queryset의 리스트로 serializer에 적용이 되기 때문에 작동이 안되는 것이었다.
  3. 내가 하고자 하는 기능은 한 사람의 프로필을 조회하는 기능이니 detail=True를 넣어야 한다고 생각했는데 그렇게 하니 내가 미리 만들어 놓은 기본 RetrieveUserSerializer가 자동으로 사용됐다. 내가 메서드에 따라서 필요한 serializer class를 미리 정의해놔서 그렇다고 생각했고 detail=False로 바꾸니 작동되었다.

0개의 댓글