DRF 4-6 상세페이지get, 수정put, 삭제delete

Grace Goh·2022년 11월 11일
0

Django Rest Framework

목록 보기
17/36
# articles/serializers.py

from rest_framework import serializers
from articles.models import Article


class ArticleSerializer(serializers.ModelSerializer):  # 가장 기본형
    user = serializers.SerializerMethodField()

    def get_user(self, obj):  # get_user로 obj(해당 article)의 user의 emial을 받아온다.
        return obj.user.email

    class Meta:
        model = Article
        fields = '__all__'


class ArticleCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ("title", "image", "content")  # 검증에 필요한 부분


class ArticleListSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()

    def get_user(self, obj):  # obj: 해당 article
        return obj.user.email

    class Meta:
        model = Article
        fields = ("pk", "title", "image", "updated_at", "user")

# articles/views.py

from rest_framework.generics import get_object_or_404
from rest_framework.views import APIView
from rest_framework import status, permissions
from rest_framework.response import Response
from articles.models import Article
from articles.serializers import ArticleSerializer, ArticleListSerializer, ArticleCreateSerializer


class ArticleView(APIView):
    def get(self, request):
        articles = Article.objects.all() # 모두
        serializer = ArticleListSerializer(articles, many=True) # 복수
        return Response(serializer.data, status=status.HTTP_200_OK)

    def post(self, request):
        # 먼저 serializer를 불러온다. () 안에 데이터를 저장한다.
        serializer = ArticleCreateSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(user=request.user)
            return Response(serializer.data)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


# id가 있어야 쓰는 API. 인자가 1개 더 있다.
class ArticleDetailView(APIView):
    def get(self, request, article_id):
        # article = Article.objects.get(id=article_id) 아래가 더 효율적인 코드
        article = get_object_or_404(Article, id=article_id)
        serializer = ArticleSerializer(article)
        return Response(serializer.data, status=status.HTTP_200_OK)

    # 수정. post가 아님.
    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() # article에 user 정보 있기 때문에 (user=request.user) 생략
                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)
            # 403: 본인이나 운영자 권한이 아닐 때

    # 삭제
    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)
            # 403: 본인이나 운영자 권한이 아닐 때

수정 권한 테스트하기

  1. login API에서 다른 id로 로그인하기
  2. 받은 access token을 Environments > local > token에 업데이트 (2칸 모두) > 저장
  3. article update에서 수정해보면...
    "권한이 없습니다." msg가 뜬다.
profile
Español, Inglés, Coreano y Python

0개의 댓글