LoginSignup
4
4

More than 3 years have passed since last update.

django-rest-frameworkでのリクエストメソッドの制御

Posted at

はじめに

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で用意されているものです。

blog/views.py
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 が利用可能

rest_framework/viewsets.py
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 のみ利用可能

rest_framework/viewsets.py
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/
OK
$ 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\" は許されていません。"}

参考

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4