はじめに
django-rest-frameworkをつかってAPI構築する際のリクエストメソッド制御方法に関してのメモ
環境
Mac 10.15.5
Python 3.8.1
Django 3.0.7
djangorestframework 3.11.0
コード
こちらの記事のコードを参考にさせて頂きました
※ GET, POST, PUT, DELETE に絞って書きます。
https://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8
継承するクラスにより制御
リクエストメソッドの許可をコントロールしているのは views.py で定義するクラスで継承する基底クラス。
以下のコードの viewsets.ModelViewSetの部分。
インポートしたrest_frameworkで用意されているものです。
import django_filters
from rest_framework import viewsets
from rest_framework import filters
from .models import User
from .models import Entry
from .serializer import UserSerializer
from .serializer import EntrySerializer
class UserViewSet(viewsets.ModelViewSet): # <- コレ
queryset = User.objects.all()
serializer_class = UserSerializer
class EntryViewSet(viewsets.ModelViewSet): # <- コレ
queryset = Entry.objects.all()
serializer_class = EntrySerializer
filter_fields = ('author', 'status')
viewsets.ModelViewSetの中身
rest_framework内にあるviewsets.py というファイルで定義されています。
ModelViewSet を継承すれば GET, POST, PUT, DELETE が利用可能となり、継承するクラスをReadOnlyModelViewSet に変更すれば GET のみに制御することができるといった感じです。
GET, POST, PUT, DELETE が利用可能
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
pass
GET のみ利用可能
class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `list()` and `retrieve()` actions.
"""
pass
PUT, DELETEを使う場合のリソースの指定
PUT や DELETE を使う場合は場合はプライマリキーまで指定する必要がある。
/api/users/
-> /api/users/1/
$ curl -X PUT -d name=yamada -d mail=yamada@gmail.com localhost:8000/api/users/
$ curl -X PUT -d name=yamada -d mail=yamada@gmail.com localhost:8000/api/users/1/
これは DjangoRestFramework が更新・削除するオブジェクトを認識する必要があるため。
リストビュー(/api/users/
)では認識できない。
こんなエラーが返ってくるかと思います。
{"detail":"Method \"DELETE\" not allowed."}
{"detail":"メソッド \"DELETE\" は許されていません。"}