Slide 30
Slide 30 text
1)APIView を継承したビューの書き⽅
29
コードは⻑くなるが、
カスタマイズしやすい
from rest_framework import status, views
from rest_framework.generics import get_object_or_404
from rest_framework.response import Response
from shop.models import Book
from .serializers import BookSerializer
class BookRetrieveUpdateAPIView(views.APIView):
"""本モデルの取得(詳細)・更新・⼀部更新・削除APIクラス"""
def get(self, request, pk, *args, **kwargs):
"""本モデルの取得(詳細)APIに対応するハンドラメソッド"""
# モデルオブジェクトを取得
book = get_object_or_404(Book, pk=pk)
# シリアライザオブジェクトを作成
serializer = BookSerializer(instance=book)
return Response(serializer.data, status.HTTP_200_OK)
def put(self, request, pk, *args, **kwargs):
"""本モデルの更新APIに対応するハンドラメソッド"""
# モデルオブジェクトを取得
book = get_object_or_404(Book, pk=pk)
# シリアライザオブジェクトを作成
serializer = BookSerializer(instance=book, data=request.data)
# バリデーションを実⾏
serializer.is_valid(raise_exception=True)
# モデルオブジェクトを更新
serializer.save()
# レスポンスオブジェクトを作成して返す
return Response(serializer.data, status.HTTP_200_OK)
(以下略)
api/views.py
例えば更新 API では、モデルオブジェクトと
⼊⼒データからシリアライザオブジェクトを
作成し、is_valid() で⼊⼒データのバリデー
ションをおこない、save() でモデルオブジェ
クトを更新して、最後にシリアライザの data
属性の値を使ってレスポンスオブジェクトを
作成して返す