본문 바로가기
스파르타코딩 AI웹개발 3기

내일배움캠프_TIL_2022.11.01

by 청귤에이드 2022. 11. 1.

오늘의 코드 [2022.11.01]

중요해서 반드시 기억할 필요가 있거나, 주의해야 코드를 답안 형식으로 주석(저의 코멘트) 함께 정리해 보았습니다.

 

Q. Django Rest Framework 개념 정리

 

articles/views.py

from rest_framework.generics import get_object_or_404

 

class ArticleDetailView(APIView):

 

    def get(self, request, article_id):

        article = get_object_or_404(Article, id=article_id)

        serializer = ArticleSerializer(article, id=article_id)

        return Response(serializer.data, status=status.HTTP_200_OK)

   

get_object_or_404 할 때 보통 Django.shortcuts 에서 호출하는 게 일반적인데 rest_framework를 사용하게 될 시 반드시 rest_framework.generics에서 호출해야 한다.

 

       def put(self, request, article_id):

        article = get_object_or_404(Article, id=article_id)

        if request.user == article.user:

            serializer = ArticleCreateSerializer(article, data=request.data)

            if serializer.is_valid():

                serializer.save()

                return Response(serializer.data, status=status.HTTP_200_OK)

            else:

                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

        else:

            return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)

 

    def delete(self, request, article_id):

        article = get_object_or_404(Article, id=article_id)

        if request.user == article.user:

            article.delete()

            return Response(status=status.HTTP_204_NO_CONTENT)

        else:

            return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)

 

- Response 뒤에 serializer에 입력된 data를 호출할 땐, 별도의 변수 지정 없이 serializer.data로 써도 되지만 (status status=status.HTTP~으로 지정해 주어야 함), 인스터스 내 변수로 사용될 때는  가령 serializer = ArticleCreateSerializer(article, data=request.data 에서 처럼 data = request.data 로 해주어야 한다고 한다.

- 게시글 수정 및 삭제 시엔 타인의 게시물을 수정 및 삭제하면 안되므로 반드시 요청한 유저가 작성자와 동일인물인지 먼저 검증해주어야 한다. 따라서 if request.user == article.user 인지 아닌지 (else)를 구분한다.

- get_object_or_404(Article, id=article_id) “Article model에 입력된 데이터 중 id article_id인 것만 불러오거나(get) 404 error로 표기하라는 의미다.

 

users/serializers.py

class UserSerializer(serializers.ModelSerializer):

    class Meta:

        model = User

        fields = "__all__"

 

    def create(self, validated_data):

        user = super().create(validated_data)

        password = user.password

        user.set_password(password)

        return user

 

    def update(self, validated_data):

        user = super().create(validated_data)

        password = user.password

        user.set_password(password)

        user.save()

        return user

UserSerializer 클래스 생성 시, 반드시 create update에 관한 매소드를 생성해주어야 하며, user.set_password(password) 해주어야 어드민 페이지에서 패스워드에 해시 처리된다.