나만보는 Django vs Django Rest Framework(DRF) 비교
1) 파이썬설치
pip3 install python3
2) DJANGO설치
pip3 install django
3) RESTFRAMEWORK설치
pip3 install djangorestframework
4) VIRTUALENV 설치
python3 -m venv 가상환경이름
5) DJANGO프로젝트 신규
django-admin startproject 프로젝트이름
6) APP 신규
python3 manage.py startapp 앱이름
7) SETTINGS.PY에 앱 추가
INSTALLED_APPS = [
...
'rest_framework',
'앱이름'
]
8) MODELS.PY수정
from django.db import models
# Create your models here.
class GoogleWeb(models.Model):
title = models.CharField(max_length=30)
link = models.URLField()
archive = models.BooleanField(default=False)
def __str__(self):
return self.title"
9) MODEL 마이그레이션
python3 manage.py makemigrations
python3 manage.py migrate
10) ADMIN.PY 수정
from django.contrib import admin
from .models import GoogleWeb
# Register your models here.
admin.site.register(GoogleWeb)
11) VIEWS.PY 수정
from django.shortcuts import render
from rest_framework import viewsets
from .serializers import GoogleWebSerializer
from .models import GoogleWeb
class GoogleWebViewSet(viewsets.ModelViewSet):
queryset = GoogleWeb.objects.all()
serializer_class = GoogleWebSerializer"
- rest_framework에서 viewsets을 import - serialzers에서 앱Serializer import - viewsets = list(전체오브젝트보기), create(개별오브젝트생성), retrieve(개별오브젝트보기), update(개별오브젝트수정), destory(개별오브젝트삭제) - 기본 viewsets 외에 라우팅이 필요한 임시메소드는 @action 데코레이터를 사용 - 개별오브젝트관련액션: @action(detail=True, methods=['post'] def extra_method(self. request, pk=None): - 전체오브젝트관련액션: @action(detail=False, methods=['post'] def extra_method2(self.request):
12) SERIALIZER.PY 생성
from rest_framework import serializers
from .models import GoogleWeb
class GoogleWebSerializer(serializers.ModelSerializer):
class Meta:
model = GoogleWeb
fields = ('id', 'title', 'link', 'archive')
- rest_framework에서 serializers를 import - 개별앱에 대한 Serializer class를 만들고, fBrowsable API에 보여줄 field값을 추가
13) URL.PY 수정
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from google_web.views import GoogleWebViewSet
router = routers.DefaultRouter()
router.register('google_web', GoogleWebViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
]
- rest_framework에서 routers를 import - 개별앱(view)로부터 viewset import - router = routers.DefaultRouter() 변수지정 - router의 register 메소드를 사용하여 개별앱의 viewset에 따른 url (자동)생성 - path("", include(router.urls)) 추가
14) SUPERUSER 생성
python3 manage.py createsuperuser
15) TEMPLATE 생성
<django rest framework 사용후기>
- view.py의 viewset이 DRF의 요체: 코드 몇줄 추가로 django 쿼리셋을 REST API로 접근가능
- viewsets = list(전체오브젝트보기) + create(개별오브젝트생성) + retrieve(개별오브젝트보기) + update(개별오브젝트수정) + destory(개별오브젝트삭제)
- django에서도 위 기능들을 구현할수 있지만, (퍼포먼스를 무시하면) 편의성 측면에서 DRF를 사용하지 않을 이유가 없어보임
- @action 데코레이터로 라우팅이 필요한 custom 메소드 구현 가능( DRF 3.8버전부터 기존 detail_route(--> @action(detail=True)와 list_route(--> @action(detail=False)를 대체)
- 금번 프로젝트에서는 front를 네티이브(안드로이드)로 구현하였으나, 요즘뜨는 react나 vue.js도 접목할수 있어 front-back의 완전한 구조분리(completely decoupled architecture)가 가능
- view.py의 viewset이 DRF의 요체: 코드 몇줄 추가로 django 쿼리셋을 REST API로 접근가능
- viewsets = list(전체오브젝트보기) + create(개별오브젝트생성) + retrieve(개별오브젝트보기) + update(개별오브젝트수정) + destory(개별오브젝트삭제)
- django에서도 위 기능들을 구현할수 있지만, (퍼포먼스를 무시하면) 편의성 측면에서 DRF를 사용하지 않을 이유가 없어보임
- @action 데코레이터로 라우팅이 필요한 custom 메소드 구현 가능( DRF 3.8버전부터 기존 detail_route(--> @action(detail=True)와 list_route(--> @action(detail=False)를 대체)
- 금번 프로젝트에서는 front를 네티이브(안드로이드)로 구현하였으나, 요즘뜨는 react나 vue.js도 접목할수 있어 front-back의 완전한 구조분리(completely decoupled architecture)가 가능
댓글을 남겨주세요 :)