Django Rest Framework
rest api 개발을 장고를 이용해 하기 위해 django rest framework 라이브러리를 이용한다.
라이브러리 설치
pip install djangorestframework
앱 생성
python manage.py startapp my_django_api
settings.py - INSTALLED_APPS 부분 추가
models.py 에 모델 만들기
model : 장고에서 데이터 서비스의 layer이다. 데이터베이스에서 테이블이 된다.
from django.db import models
# Create your models here.
class Test(models.Model):
id = models.IntegerField()
name = models.CharField(max_length=100)
친절하게 id라는 이름은 기본키가 되어야 한다고 알려준다.
id의 괄호안에 primary_key=True 를 넣어준다.
앱 내 serializers.py 파일 생성
serializers : api 통신 시 모델 데이터를 json 형태로 변경해준다.
from rest_framework import serializers
from .models import Test
class TestSerializer(serializers.ModelSerializer):
class Meta:
model = Test # 모델
fields = ("__all__") # 모든 필드
# fields = ('id', 'name') # 필드 선택
views.py 파일에 추가
model에 대한 기능을 정의할 수 있다.
viewset : viwe가 아닌 viewset을 사용하면 CRUD를 따로 정의할 필요가 없다. 요청 시 get, delete, post 만 변경해주면 된다.
클래스로 한번에 관리가 되어 편하지만 상세히 나누어야 할 경우 다른 방법을 사용해야한다. (아래에 추가)
from django.shortcuts import render
from rest_framework import viewsets
from .serializers import TestSerializer
from .models import Test
# Create your views here.
class TestView(viewsets.ModelViewSet):
queryset = Test.objects.all()
serializer_class = TestSerializer
라우터 등록
url 경로를 등록해줘야 한다. 해당 경로로 요청을 던질 수 있다.
1. 프로젝트 내 urls.py 파일에 앱의 urls.py의 경로를 이용하기 위해 등록한다.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('my_django_api.urls')), # 앱의 urls.py 등록
]
2. 앱 내 urls.py 파일이 없다면 새로 만들고 경로를 정의 해준다.
from django.urls import include, path
from rest_framework import routers
from . import views #views.py
router = routers.DefaultRouter() # DefaultRouter를 설정
router.register('test', views.TestView) # test 경로와 view를 등록
urlpatterns = [
path('', include(router.urls))
]
마이그레이션
python manage.py makemigrations
마이그레이션 파일이 만들어 진다.
python manage.py migrate
테이블이 만들어진다.
** @api_view 데코레이터를 이용해서 Viewset으로 통합되어 관리하기 보다 더 상세히 함수로 나누어 관리할 수 있다.
views.py에 함수를 만들고 @api_view() 데코레이터 적용
rest_framework.decorators에서 import 해줘야한다.
# views.py
from rest_framework.response import Response
# from rest_framework import viewsets
from .serializers import TestSerializer
from .models import Test
from rest_framework.decorators import api_view
# Create your views here.
# class TestView(viewsets.ModelViewSet):
# queryset = Test.objects.all()
# serializer_class = TestSerializer
@api_view(['GET'])
def getText(request):
queryset = Test.objects.all()
print(queryset)
serializer = TestSerializer(queryset, many=True)
return Response(serializer.data)
라우터 적용
# urls.py
from django.urls import path
from . import views #views.py
urlpatterns = [
path('test', views.getText),
]
마이그레이션 삭제 (테이블 삭제)
1. 테이블 드롭
2. migrations 폴더 내 해당 마이그레이션 파일 삭제
3. django_migrations 테이블에서 해당 row 삭제
4. 다시 마이그레이션 명령어 실행