DRF의 ModelSerializer를 활용한 Django Model JSON 형태 직렬화
단일 모델 기반 데이터 조회, 생성, 수정, 삭제하는 기본 API 구성
ModelSerializer는 Django의 ModelForm과 비슷한 역할을 함
직렬화와 유효성 검사, 저장까지 전부 처리할 수 있어 매우 강력
urls.py & 기본 구조 설정
프로젝트 URL 연결
# api_pjt/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("api/v1/articles/", include("articles.urls")),
]
앱 URL 설정
# articles/urls.py
from django.urls import path
from . import views
app_name = "articles"
urlpatterns = [
path("", views.article_list, name="article_list"),
path("<int:pk>/", views.article_detail, name="article_detail"),
]
Article 모델의 Serializer 정의
# articles/serializers.py
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = "__all__"
API 기능별 정리
목록 조회 (List)
# articles/views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Article
from .serializers import ArticleSerializer
@api_view(["GET"])
def article_list(request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)

상세 조회 (Detail)
# articles/views.py
from django.shortcuts import get_object_or_404
@api_view(["GET"])
def article_detail(request, pk):
article = get_object_or_404(Article, pk=pk)
serializer = ArticleSerializer(article)
return Response(serializer.data)

생성 (Create)
# articles/views.py
from rest_framework import status
@api_view(["GET", "POST"])
def article_list(request):
if request.method == "GET":
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
elif request.method == "POST":
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)

삭제 (Delete)
# articles/views.py
@api_view(["GET", "DELETE"])
def article_detail(request, pk):
article = get_object_or_404(Article, pk=pk)
if request.method == "GET":
serializer = ArticleSerializer(article)
return Response(serializer.data)
elif request.method == "DELETE":
article.delete()
return Response({"delete": f"Article({pk}) is deleted."}, status=status.HTTP_200_OK)

수정 (Update)
@api_view(["GET", "DELETE", "PUT", "PATCH"])
def article_detail(request, pk):
article = get_object_or_404(Article, pk=pk)
if request.method == "GET":
serializer = ArticleSerializer(article)
return Response(serializer.data)
elif request.method == "DELETE":
article.delete()
return Response(
{"delete": f"Article({pk}) is deleted."}, status=status.HTTP_200_OK
)
elif request.method in ["PUT", "PATCH"]:
# partial=True는 PATCH일 때만 적용
serializer = ArticleSerializer(
article, data=request.data, partial=(request.method == "PATCH")
)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
PUT은 전체 필드를 요구하고, PATCH는 일부 필드만 수정할 때 사용
→ partial=True 옵션을 사용하여 PUT과 PATCH를 구분


DRF Serializer - Partial Updates
Serializers - Django REST framework
www.django-rest-framework.org
'∟ Framework > ∟ DRF' 카테고리의 다른 글
DRF models with relationship CRUD API 구현 (0) | 2025.03.30 |
---|---|
Class Based View (CBV) (0) | 2025.03.29 |
Django REST Framework(DRF) API 구현 (0) | 2025.03.29 |
JSON Response와 Serialization (0) | 2025.03.29 |
RESTful API와 JSON (1) | 2025.03.28 |