PUT / DELETE

data_hamster·2023년 4월 29일
0

학습주제
Djagno RSET framework에서 PUT /DELETE 기능 구현

학습내용

question_list에 이어, 이번엔 question_detail을 구현한다. 이는 단일 객체에 대해 적용할 예정이다. 어떤 단일 객체인지 알아야 하므로, id를 인자로 받는다.

@api_view()
def python_detail(request, id):
	question = Question.obejcts.get(pk=id)
    serializer = QuestionSerializer(question)
    return Response(serializer.data)

serializer는 question을 인자로 받았으므로, 이는 request.data를 받는 CREATE가 아닌 UPDATE다. 저 question 내에는 id가 있어, DB 내 question id와 비교 후 값을 갱신 예정이다.

return Response(serailizer.data) serializer는 리턴으로 serialized가 된 데이터를 제공한다.

polls_api 의 urls.py로 넘어가서

id를 전달해줄 새로운 url이 필요하기 때문에 새로운 path를 추가해준다.
path('question/<int:id.>/, question_detail, name='question_detail')
![](https://velog.velcdn.com/images/kjw9684/post/5174c8e6-b690-400b-a47f-e4fd42a83980/image.png
이렇게 하나의 값을 리턴해주는 모습을 본다. 상단에 Django REST framework인 이 양식이 사용된 이유는 question_detail을 데코레이터 @api_view로 리턴값을 꾸며주었기 때문이다.

question/3에서 urls.py path에서 <int:id>로 활용하였다.

이번에는 하나의 question을 수정해 보도록 한다. @api_view()에 아무것도 없으면, GET이 자동으로 지정되지만, 안에 POST를 추가로 넣는다. 다른 사람들과의 협업을 위해 GET도 같이 추가한다.

question_list 때와 마찬가지로 request.method로 무얼 받았는지에 따라 분기를 나누어 준다. get, post 등

  • id로 question 오브젝트를 얻어
  • serializer에 request로 받은 데이터와 함께 넣는다
  • 만일 정합성 통과를 하면
  • 저장하고 데이터 반환
  • 정합성 실패 시
  • 에러 반환
    if request.method == 'PUT':
        question = Question.objects.get(pk=id)
        serializer = QuestionSerializer(question, 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)        

만일 비정상적인 id가 들어왔을 경우, 그 id값을 가지고 get을 할 경우 에러를 발생시킬 것이다. 이에 대해 처리한다. 지난번에 썼던 get_object_or_404를 사용한다.
from django.shortcuts import render, get_object_or_404


Allow에 PUT이 추가된 것을 볼 수있다.

아래 Content에 내용을 입력해 UPDATE를 수행해본다.
"커피 vs 녹차 선택은?"
개발자도구 - 네트워크를 열고 보면, Request Method PUT이 수행, Status Code도 200으로 정상적으로 수행 됨을 확인하였다.

DELETE 구현

@api_view(['GET','PUT','DELETE'])
question = get_object_or_404(Question, pk=id)
저 행동은 모든 method에서 반복되는 것을 확인할 수있다. 그럼 제일 최상단으로 올려 코드를 최적화 한다.

    if request.method == 'DELETE':
        question.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

바로 delete() 메서드를 사용하면 지워진다. 리턴으로는 status만 반환. 잘 지워졌다는 코드인 204 no content를 리턴시킨다.

DELETE가 추가되었다.
삭제를 하고 새로고침을 하면

Not found가 뜬다.

profile
반갑습니다 햄스터 좋아합니다

0개의 댓글