학습주제
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 등
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으로 정상적으로 수행 됨을 확인하였다.
@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가 뜬다.