DRF_ModelViewSetでHTTPリクエストに応じたCRUD操作を実行する #359
Django REST Framework (DRF) は、API開発をサポートするための強力なフレームワークです。そこで扱えるViewsetsという機能は、RESTful APIの標準的なエンドポイントを作成してCRUD操作 (Create, Retrieve, Update, Delete) を行うためのメソッドを、自動的に提供してくれます。
ModelViewSetで解説していきます。
ModelViewSetの基本的な定義方法
基本的には、以下のように記載するだけで使用できます。
[views.py]
from rest_framework import viewsets
from myapp.serializers import MyModelSerializer
from myapp.models import MyModel
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
querysetには、このViewSetsで使用するモデルオブジェクトのクエリセットを指定します。
serializer_classには、該当モデルのシリアライザクラスを指定します。
これだけの設定で、ViewSetsはモデルのデータのCRUD操作に対応する自動的なAPIエンドポイントを提供します。
ルーティングは以下のように設定できます。
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import MyViewSet
router = DefaultRouter()
router.register('my-models', MyViewSet)
urlpatterns = [
path('', include(router.urls)),
]
DefaultRouterはビューをエンドポイント(ここでは'my-models')に紐づけるために使用しています。
ここで以下のリクエストを送信すれば、list()メソッドが呼ばれます。
GET /my-models/
以下のリクエストならretrieve()メソッドです。末尾の1/はモデルオブジェクトのpk (primary key) として扱われます。
GET /my-models/1/
HTTPリクエストと対応するメソッド
上で少し触れましたが、DRFのViewSetsでは、各HTTPリクエストは以下のように処理されます。
GETリクエスト:
list()メソッドで処理されます。一覧表示を行うため、データベースからモデルオブジェクトを取得し、シリアライザでシリアライズした結果をレスポンスとして返します。また、URLの末尾にpkをつけてリクエストすることで、retrieve()メソッドで個別のオブジェクトを取得することもできます。
POSTリクエスト:
create()メソッドで処理されます。新しいオブジェクトを作成するため、シリアライザでリクエストデータをデシリアライズし、バリデーションを行います。バリデーションが成功した場合、オブジェクトを保存し、作成されたオブジェクトをシリアライズした結果をレスポンスとして返します。
PUTリクエスト:
update()メソッドで処理されます。更新するオブジェクトを取得し、シリアライザでリクエストデータをデシリアライズします。バリデーションが成功した場合、オブジェクトを保存し、更新されたオブジェクトをシリアライズした結果をレスポンスとして返します。
PATCHリクエスト:
PUTリクエストと同じくupdate()メソッドで処理されますが、部分更新を行うため、シリアライザのpartial=Trueを設定します。
DELETEリクエスト:
destroy()メソッドで処理されます。削除するオブジェクトを取得し、delete()メソッドでオブジェクトを削除します。削除されたオブジェクトの情報をレスポンスとして返します。
ここまでお読みいただきありがとうございました!