오늘의 코드 [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) 해주어야 어드민 페이지에서 패스워드에 해시 처리된다.
'스파르타코딩 AI웹개발 3기' 카테고리의 다른 글
| 내일배움캠프_TIL_2022.11.03 (0) | 2022.11.04 |
|---|---|
| 내일배움캠프_TIL_2022.11.02 (0) | 2022.11.04 |
| 내일배움캠프_TIL_2022.10.31 (0) | 2022.11.01 |
| 내일배움캠프_WIL_2022.10.30 (0) | 2022.10.31 |
| 내일배움캠프_TIL_2022.10.28 (0) | 2022.10.29 |