DRF Single Model CRUD

Ryu Honggyu·2024년 9월 2일

Django

목록 보기
17/19
post-thumbnail

DRF Single Model

  • DRF 로 단일 모델의 데이터를 직렬화해 JSON 형식으로 응답할 수 있도록 하는 작업.
  • Django 모델 데이터를 직렬화해 클라이언트에 전달하는 API 를 만들때 요구됨.
  • 이후 추가할 CRUD 는 DRF Single Model 을 적용, 데이터를 JSON 형식으로 받아 Post 한다.

CRUD 기능 추가

api_pjt/url.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")),
]
  • 기존의 형태를 유지

articles/url.py

from django.urls import path
from . import views

app_name = "articles"
urlpatterns = [
    path("", views.article_list, name="article_list"),
    path("/", views.article_detail, name="article_detail"),
]

articles/view.py

from django.shortcuts import get_object_or_404
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .serializers import ArticleSerializer
from .models import Article
from rest_framework import status

# 전체 Article 조회 및 새 Article 생성

@api_view(["GET", "POST"])
def article_list(request):
    # GET 요청: 모든 Article 객체를 조회하고 직렬화하여 반환
    if request.method == "GET":
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)
    
    # POST 요청: 새 Article 객체를 생성하고 직렬화하여 반환
    elif request.method == "POST":
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)

# 단일 Article 조회, 수정 및 삭제

@api_view(["GET", "DELETE", "PUT"])
def article_detail(request, pk):
    # pk에 해당하는 Article 객체를 조회, 없으면 404 반환
    article = get_object_or_404(Article, pk=pk)
    
    # GET 요청: 해당 Article 객체를 직렬화하여 반환
    if request.method == "GET":
        serializer = ArticleSerializer(article)
        return Response(serializer.data)
    
    # PUT 요청: 해당 Article 객체를 수정하고 직렬화하여 반환
    elif request.method == "PUT":
        serializer = ArticleSerializer(article, data=request.data, partial=True)
        if serializer.is_valid(raise_exception=True):
            serializer.save() # 유효한 값일 시 저장
            return Response(serializer.data)

    # DELETE 요청: 해당 Article 객체를 삭제하고 삭제 메시지 반환
    elif request.method == "DELETE":
        article.delete() # Article 삭제
        data = {"delete": f"Article({pk}) is deleted."} # 삭제 메시지
        return Response(data, status=status.HTTP_200_OK)


CRUD 기능 테스트

127.0.0.1:8000 로 접근

  • 들어갈 데이터는 Json 형태로 작성한다.
    {
        "title": "제목 테스트",
        "content": "내용 테스트"
    }
    

  • Post 버튼을 누르면 정상적으로 Create 되는 것을 확인할 수 있다.

Postman

  • Postman 을 이용해 추가했던 CRUD 기능을 테스트해볼 수도 있다.
  • Delete 로 30번째 Article 삭제 시도시 지정해뒀던 "Article({pk}) is deleted." 삭제 메시지가 뜨는 것이 확인된다.
profile
알고리즘 & 웹 & CS & AI

0개의 댓글