[Django] GET 개발 과정

채린·2023년 9월 1일

마이페이지 api

화면:
  1. urls.py
    urlpatterns = [
        path('',MyPageView.as_view()),
    ]
  2. views.py마이페이지는 GET이니까
    일단 윗부분에 자기 정보부터 가져오자
    class MyPageView(views.APIView):
        permission_classes = [IsAuthenticated]       # 현재 로그인한 사람 가져오려면 필요
        def get(self, request):                      # GET이니까
            user=MyPageSerializer(request.user)      # 유저 정보 시리얼라이저에 넣어서 가져오기_request.user는 현재 로그인한 user
            return Response({'message': '마이페이지 조회 성공', 'data': {'user': user.data}}, status=status.HTTP_200_OK)

serializer: 시리얼라이저로 모델 중 사용할 정보를 가공한다고 생각

                   유저의 많은 정보중에 아이디 프로필 닉네임 관심사 팔로워만 필요해

 class MyPageSerializer(serializers.ModelSerializer):
     class Meta:
         model=User
         fields=['id','profile','nickname','interest','follow']

결과:

잘 왔지만 interest랑 follow는 id만 오니까 형식에 맞게 추가
얘네는 account에 있는 시리얼라이져(중복이니까 가져다 쓰자(새로만들어도됨))

시리얼라이저

class MyPageSerializer(serializers.ModelSerializer):
    follow=UserProfileSerializer(many=True, read_only=True)
    interest=InterestSerializer(many=True, read_only=True)
    class Meta:
        model=User
        fields=['id','profile','nickname','interest','follow']

결과:

이런식으로 북마크한 post도 가져오는것 한번 더 해보자면

view

class MyPageView(views.APIView):
    permission_classes = [IsAuthenticated]     
    def get(self, request):
        # my 정보
        user=MyPageSerializer(request.user)      
        # 북마크한 Post
        book_user = request.user                                    # 현재 사용자                             
        book_posts= Post.objects.filter(bookmark=book_user.id)      # 현재 사용자를 bookmark에 가지고 있는 Post객체들을 필터링해서 가져옴
        for post in book_posts:                                     # 이 Post들의 is_booked는 True. 
            post.is_booked=True                                     # 이건 모델에 있는 정보가 아니라 우리가 상황에 따라 넘겨줘야 하는 정보니까 직접 적어준다
        bookmarkPost = BookPostSerializer(book_posts, many=True)    # BookPostSerializer에 Post객체 넣어서 시리얼라이저 형태에 맞게 만든다
        return Response({'message': '마이페이지 조회 성공', 'data': {'user': user.data,'book_posts':bookmarkPost.data}}, status=status.HTTP_200_OK)

시리얼라이저에 넣기 전에 시리얼라이저에 있는 필드의 값을 만들어줄 수 있다. 따로 하거나 시리얼라이저(posts, is_booked=True)이런식으로
newQue.save(que_line=line,que_postsec=postsec,que_user=now_user) 이렇게 해도됐다. 얘네는 시리얼라이저에 없는 필드
manytomany 필드는 시리얼라이저에 넣은 다음(시리얼라이저 필드에는 x) add해주면 된다

serializer

class BookPostSerializer(serializers.ModelSerializer):
    hashtag=InterestSerializer(many=True, read_only=True)
    is_booked = serializers.BooleanField(default=False)
    class Meta:
        model=Post
        fields=['post_id','title','post_image','diff','is_booked','hashtag']

그러면 어떻게 되느냐

{
  "message": "마이페이지 조회 성공",
  "data": {
    "user": {
      "id": 5,
      "profile": "[이미지]",
      "nickname": "토끼",
      "interest": [
        {
          "hashtag": "운동"
        },
        {
          "hashtag": "라이프"
        }
      ],
      "follow": [
        {
          "id": 1,
          "nickname": "갓기사자",
          "profile": "[type=file의 이미지]"
        },
        {
          "id": 2,
          "nickname": "갓기사자",
          "profile": "[type=file의 이미지]"
        },
        {
          "id": 4,
          "nickname": "토끼토끼",
          "profile": ""
        }
      ]
    },
    "book_posts": [
      {
        "post_id": 1,
        "title": "첫번째 게시물",
        "post_image": null,
        "diff": 1,
        "is_booked": true,
        "hashtag": [
          {
            "hashtag": "라이프"
          }
        ]
      }
    ]
  }
}

끝!

원래 template → urls.py → views.py → model 이런느낌이었다면 (화살표는 관계지 개발 순서 의미X)

urls.py → views.py → serializer → model 느낌!

그래서 get할때도 ex 검색이면 검색어로 model에서 필터링해서 객체 가져오고, 그걸 다시 시리얼라이저로 처리해서 뷰에 넘겨주는 것..!

0개의 댓글