- 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)