TIL117. DRF : ModelViewSet 간단 사용기

11169 단어 drfdrf

📌 이 포스팅에서는 DRF 초기세팅 및 ModelViewSet으로 간단한 API를 구현하는 과정을 정리하였습니다.



🌈 ModelViewSet 간단 사용기

🔥 DRF 초기 settings

🔥 serializers 만들기

🔥 HTTPie 사용하여 API 다루기



1. DRF 초기 settings

🤔 django-rest-framework 설치

✔️ 설치 방법은 아래와 같다.

$ > pip install djangorestframework

✔️ 설치 후, requirements.txt에 해당 버전을 추가해준다.

# requirements.txt
Django==4.0.1
djangorestframework==3.13.1

✔️ 추가 후, INSTALLED_APPS에 djangorestframework를 추가시킨다.

# settings.py
DJANGO_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
PROJECT_APPS = [
]
THIRD_PARTY_APPS = [
    'rest_framework',  # 👈 추가
]
INSTALLED_APPS = DJANGO_APPS + PROJECT_APPS + THIRD_PARTY_APPS

✔️ ROOT_URLCONF에 아래 경로를 추가해준다.
✔️ 'api-auth/'는 django에 기본 auth를 사용해서 login을 하기 위해 추가한 것이다. 로그인 기능이 필요없이 간단한 api 테스트를 할 경우에 필요하지 않다.

# config/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls')), # 👈 추가
]


2. serializers 만들기

🤔 models.py & serializers 작성

✔️ 간단한 Post를 작성할 수 있는 Model을 만들고, migration 한다.

# models.py
from django.db import models
class Post(models.Model):
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

✔️ ModelSerializer를 상속받아, serializer를 아래 처럼 만들 수 있다.

✔️ serializers는 Django From과 유사한 형태를 가지고 있다.

# serializers 
from rest_framework.serializers import ModelSerializer
from .models import Post
class PostSerializer(ModelSerializer):
    class Meta:
        model = Post        # 👈 model 지정
        fields = '__all__'  # 👈 모든 field 지정

🤔 views.py & urls.py 작성

✔️ ModelViewSet을 상속받아 View를 작성한다. 이렇게하면, 2가지의 View를 1개로 통합하여 사용할 수 있다.

✔️ 2개의 View란, 아래의 기능을하는 API를 의미한다.

  • [GET] /post/ : post list 읽어오기
  • [POST] /post/ : post 생성하기
  • [GET] /post/pk : 1번 post 상세보기
  • [PUT] /post/pk : 1번 post 수정
  • [DELETE] /post/pk : 1번 post 삭제

✔️ 즉, PostViewSet 하나로, Post를 CRUD할 뿐만아니라, list까지 요청할 수 있다.

from rest_framework.viewsets import ModelViewSet
from .serializers import PostSerializer
from .models import Post
class PostViewSet(ModelViewSet):
    queryset=Post.objects.all() # 👈 queryset 작성
    serializer_class=PostSerializer  # 👈 serializer 매핑

✔️ DefaultRouter 객체를 생성 후, 생성된 인스턴스에 url을 아래처럼 등록해준다.

# urls.py
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
router.register('post', views.PostViewSet)  # 👈 2개 URL을 만들어준다.
urlpatterns = [
    path('', include(router.urls)),
]


3. HTTPie 사용하여 API 다루기

🤔 JSON 응답뷰 보기

✔️ 서버를 실행 후 http://127.0.0.1/post로 접근하면 아래와 같은 화면을 볼 수 있다. 여기서 게시글을 확인하고, 등록도 가능하다.

🤔 httpie 사용하기

✔️ httpie는 아래의 명령어를 통해 설치한다.

$> pip install httpie

✔️ httpie를 설치했다면, http 뒤에 endpoint를 작성하면 PostMan처럼 사용할 수 있다.

$ >http http://localhost:8000/post/

✔️ 게시글 상세보기는 뒤에 pk를 적어주면 된다. 맨 앞에 매서드를 적지 않으면 Default로 GET요청이 이뤄진다.

$ > http http://localhost:8000/post/1/

✔️ POST 요청으로 게시글을 작성하려면, endpoint 뒤에 한칸 띄고, field명="메시지 내용"을 적는다.

$ > http http://localhost:8000/post/ message="4th Test Message"

✔️ 수정(PUT)과 삭제(DELETE)는 매서드를 앞에 꼭 적어주어야 한다.

$ > http --form PUT http://localhost:8000/post/4/ message="I just modified the 4th message."

좋은 웹페이지 즐겨찾기