from django.db import models
# Create your models here.
class Book(models.Model):
bid = models.IntegerField(primary_key=True)
title = models.CharField(max_length=50)
author = models.CharField(max_length=50)
category = models.CharField(max_length=50)
pages = models.IntegerField()
price = models.IntegerField()
published_date = models.DateField()
description = models.TextField()
❗️❗️❗️ 이름이 어떻게 만들어지는지 알 필요가 있기 때문에 이렇게 만든 것이고, 실무에서는 DB 의 테이블을 이런 방식으로 생성하지 않는다 ❗️❗️
python manage.py makemigrations
python manage.py migrate
Django 에서는 ModelSerializer 클래스를 상속받아서 model 과 fields 속성을 설정하면 되는데 model 은 변환할 Model 클래스 이름을 설정하고 fields 에는 변환할 컬럼(속성)을 배열로 설정하면 된다.
example 앱에 serializers.py 파일을 생성하고 작업 (이름 고정)
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['bid','title','author','category',
'price','pages','published_date','description']
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status
from rest_framework.generics import get_object_or_404
from .models import Book
from .serializers import BookSerializer
# @으로 시작하는 것은 decorator 라고 하는데
# 자주 사용하거나 만들기가 복잡한 코드가 있을 때
# 이 코드를 직접 작성하는 대신에 decorator 가 그 코드를 대신 작성
@api_view(['GET'])
def helloAPI(request):
return Response('전송될 데이터')
# Create your views here.
@api_view(['GET'])
def booksAPI(request):
# 전체 데이터 가져오기
books = Book.objects.all()
# 파이썬 데이터를 JSON 형식으로 변환
# 데이터가 1개인 경우는 many=True 생략
serializer = BookSerializer(books, many=True)
# 응답 전송
return Response(serializer.data, status=status.HTTP_200_OK)
from django.urls import path, include
from .views import helloAPI
from .views import booksAPI
urlpatterns = [
# example 에 오면 helloAPI를 불러라
path('hello',helloAPI),
path('fbv/books', booksAPI)
]
서버 사이드 렌더링에서는 삽입 화면으로 이동하는 GET 요청 과 실제 데이터를 입력한 후 삽입을 처리하는 2개의 과정으로 진행되지만 API 서버에서는 실제 데이터를 삽입하는 처리만 수행해주면 된다
결과는 어떤 방식으로 전송할 것인지 판단해야한다
views.py 에서 삽입 요청을 처리하는 함수를 만든다
@api_view(['POST'])
def booksInsertAPI(request):
# 삽입에서 넘어온 파라미터를 모델로 변환
# 클라이언트에서는 BookSerializer 에 설정된 속성들의 값을 모두 전달해야 함
# 전송된 파라미터를 Model 의 데이터로 변환하는 것을 역직렬화 라고 한다
serializer = BookSerializer(data = request.data)
# 데이터 유효성 검사
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
from django.urls import path, include
from .views import helloAPI
from .views import booksAPI
from .views import booksInsertAPI
urlpatterns = [
# example 에 오면 helloAPI를 불러라
path('hello',helloAPI),
path('fbv/books', booksAPI),
path('fbv/books/insert', booksInsertAPI)
]
200 번 OK 가 뜨면 성공한 것
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status
from rest_framework.generics import get_object_or_404
from .models import Book
from .serializers import BookSerializer
# @으로 시작하는 것은 decorator 라고 하는데
# 자주 사용하거나 만들기가 복잡한 코드가 있을 때
# 이 코드를 직접 작성하는 대신에 decorator 가 그 코드를 대신 작성
@api_view(['GET'])
def helloAPI(request):
return Response('전송될 데이터')
# Create your views here.
@api_view(['GET','POST'])
def booksAPI(request):
if request.method == 'GET':
# 전체 데이터 가져오기
books = Book.objects.all()
# 파이썬 데이터를 JSON 형식으로 변환
# 데이터가 1개인 경우는 many=True 생략
serializer = BookSerializer(books, many=True)
# 응답 전송
return Response(serializer.data, status=status.HTTP_200_OK)
elif request.method == 'POST':
# 삽입에서 넘어온 파라미터를 모델로 변환
# 클라이언트에서는 BookSerializer 에 설정된 속성들의 값을 모두 전달해야 함
# 전송된 파라미터를 Model 의 데이터로 변환하는 것을 역직렬화 라고 한다
serializer = BookSerializer(data=request.data)
# 데이터 유효성 검사
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
from django.urls import path, include
from .views import helloAPI
from .views import booksAPI
urlpatterns = [
# example 에 오면 helloAPI를 불러라
path('hello',helloAPI),
path('fbv/books', booksAPI),
]
# 상세보기 처리를 위한 메서드
@api_view(['GET'])
def bookAPI(request, bid):
# 데이터 찾아오기
# bid 에 해당하는 데이터가 없으면 404에러를 발생시키고 존재하면 찾아와서
# book에 대입
book = get_object_or_404(Book,bid=bid)
serializer = BookSerializer(book)
return Response(serializer.data, status=status.HTTP_200_OK)
from django.urls import path, include
from .views import helloAPI
from .views import booksAPI
from .views import bookAPI
urlpatterns = [
# example 에 오면 helloAPI를 불러라
path('hello',helloAPI),
path('fbv/books', booksAPI),
path('fbv/books/<int:bid>',bookAPI),
]
Function Based View(FBV) : @api_view 와 함수를 이용해서 처리하는 방식
Class Based View(CBV) : 클래스를 만들어서 함수를 오버라이딩 형태로 요청을 처리
클래스 내부에 get, put, delete, post 형태의 데이터 함수가 존재하고, 매개변수를 받아서 list(목록 보기), create(삽입), retrieve(1개 가져오기), update(수정), destroy(삭제) 를 호출하면 작업을 수행
클래스를 만들 때는 mixins 라는 패키지의 ListModelMixin, CreateModelMixin, RetriveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView 클래스를 상속받아서 사용한다.
from rest_framework import generics, mixins
# 전체 목록 보기 와 삽입을 처리
class BooksAPIMinxins(mixins.ListModelMixin,generics.GenericAPIView):
# 전체 데이터와 serializer 를 설정
queryset = Book.objects.all()
serializer_class = BookSerializer
# get 요청 처리
def get(self,requset,*args,**kwargs):
return self.list(requset, *args, **kwargs)
# post 요청 처리
def post(self,requset,*args,**kwargs):
return self.create(requset, *args, **kwargs)
# 상세보기, 수정, 삭제를 처리할 클래스 - bid 를 매개변수로 받아야 한다
class BookAPIMinxins(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,
mixins.DestroyModelMixin, generics.GenericAPIView):
# 전체 데이터와 serializer 를 설정
queryset = Book.objects.all()
serializer_class = BookSerializer
# 매개변수 필드를 설정
lookup_field = 'bid'
# bid 를 이용해서 하나의 데이터 찾아오기
def get(self,requset,*args,**kwargs):
return self.retrieve(requset, *args, **kwargs)
# bid 를 이용해서 데이터 수정
def put(self,requset,*args,**kwargs):
return self.update(requset, *args, **kwargs)
# bid 를 이용해서 데이터 삭제
def delete(self,requset,*args,**kwargs):
return self.destroy(requset, *args, **kwargs)
from django.urls import path, include
from .views import helloAPI
from .views import booksAPI
from .views import bookAPI
from .views import BookAPIMinxins
from .views import BooksAPIMinxins
urlpatterns = [
# example 에 오면 helloAPI를 불러라
path('hello',helloAPI),
path('fbv/books', booksAPI),
path('fbv/books/<int:bid>',bookAPI),
path('mixin/books',BooksAPIMinxins.as_view()),
path('mixin/book/<int:bid>',BookAPIMinxins.as_view()),
]