Programming Language/Django

Django 13)REST API_3

Sergemeow 2023. 4. 18. 17:28
  • Raising an exception on invalid data
    • 유효하지 않은 데이터에 대해 예외 발생시킴
    • is_valid()는 유효성 검사 오류가 있는 경우 ValidationError 예외를 발생시키는 선택적 raise_exception 인자를 사용할 수 있음
    • DRF에서 제공하는 기본 예외 처리기에 의해 자동으로 처리되며 기본적으로 HTTP400 응답을 반환

POST

  • 요청에 대한 데이터 생성이 성공했을 경우는 201 Created 상태 코드를 응답하고 실패 했을 경우는 400 Bad request를 응답
from .serializers import ArticleListSerializer
from rest_framework import status

@api_view(['GET', 'POST'])
def article_list(request):
    if request.method == 'GET':
        articles = Article.objects.all()
        serializer = ArticleListSerializer(articles, many=True)
        return Response(serializer.data)
    
    elif request.method == 'POST':
        serializer = ArticleListSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED) 

DELETE

@api_view(['GET', 'DELETE'])
def article_detail(request, article_pk):
    article = Article.objects.get(pk=article_pk)
    if request.method =='GET':
        serializer = ArticleListSerializer(article)
        return Response(serializer.data)
    
    elif request.method == 'DELETE':
        article.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

PUT

@api_view(['GET', 'DELETE', 'PUT'])
def article_detail(request, article_pk):
    article = get_object_or_404(Article, pk=article_pk)
    ...
		...
    elif request.method == 'PUT':
        serializer = ArticleListSerializer(article, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data)

GET - List

# serializers.py

from .modeles import Article, Comment

class CommentSerializer(serializers.ModelSerializer):
	class Meta:
		model = Comment
		fields = '__all__'
urlpatterns = [
	...,
	path('comments/', views.comment_list),
]
# articles/views.py

from .models import Article, Comment
from .serializers import ArticleListSerializer, ArticleSerializer, CommentSerializer

...
@api_view(['GET'])
def comment_list(request):
	comments = Comment.objects.all()
	serializer = CommentSerializer(comments, many=True)
	return Response(serializer.data)

GET - Detail

# articles/urls.py

urlpatterns = [
	...,
	path('comments/<int:comment_pk>/', views.comment_detail),
]
# articles/views.py

@api_view(['GET'])
def comment_detail(request, comment_pk):
	comment = Comment.objects.get(pk=comment_pk)
	serializer = CommentSerializer(comment)
	return Response(serializer.data)

POST

# articles/urls.py

urlpatterns = [
	...,
	path('articles/<int:article_pk>/comments/', views.comment_create),
]
# articles/views.py

@api_view(['POST'])
def comment_create(request, article_pk):
	article = Article.objects.get(pk=article_pk)
	serializer = CommentSerializer(data=request.datda)
	if serializer.is_valid(raise_exception=True):
		serializer.save()
		return Response(serializer.data, status=status.HTTP_201_CREATED)
  • Passing Additional attributes to .save()
    • save() 메서드는 특정 Serializer 인스턴스를 저장하는 과정에서 추가적인 데이터를 받을 수 있음
    • CommentSerializer를 통해 Serialize 되는 과정에서 Parameter로 넘어온 article_pk에 해당하는 article 객체를 추가적인 데이터를 넘겨 저장
# articles/views.py

@api_view(['POST'])
def comment_create(request, article_pk):
	article = Article.objects.get(pk=article_pk)
	serializer = CommentSerializer(data=request.data)
	if serializer.is_valid(raise_exception=True):
		serializer.save(article = article)
		return Response(serializer.data, status=status.HTTP_201_CREATE)
  • 위와 같이하면 에러 발생. CommentSerializer에서 article field 데이터 또한 사용자로부터 입력 받도록 설정되어 있기 때문
  • read_only_fields를 사용해 외래 키 필드를 ‘읽기 전용 필드’로 설정
  • 읽기전용필드는 데이터를 전송하는 시점에 헤당 필드를 유효성 검사에서 제외 시키고 데이터 조회시에는 출력하도록 함
# articles/serializers.py

class CommentSerializer(serializers.ModelSerializer):
	class Meta:
		model = Comment
		fields = '__all__'
		read_only_fields = ('article',)

DELETE & PUT

  • 댓글 데이터 삭제 및 수정 구현하기
# articles/views.py

@api_view(['GET', 'DELETE', 'PUT'])
def comment_detail(request, comment_pk):
	comment = Comment.objects.get(pk=comment_pk)
	if request.method == 'GET':
		serializer = CommentSerializer(comment)
		return Response(serializer.data)
	elif request.method == 'DELETE':
		comment.delete()
		return Response(status=status.HTTP_204_NO_CONTENT)
	elif request.method == 'PUT':
		serializer = CommentSerializer(comment, data=request.data)
		if serializer.is_valid(raise_exception=True):
			serializer.save()
			return Response(serializer.data)

'Programming Language > Django' 카테고리의 다른 글

Django 14)REST API_4  (0) 2023.04.18
Django 12)REST API_2  (0) 2023.04.13
Django 11)REST API_1  (0) 2023.04.13
Django 10)Authorization/Authentication_2  (0) 2023.04.12
Django 09)Authorization/Authentication_1  (0) 2023.04.12