Django REST framework (DRF) でModelViewSetを部分的に使いたい
ModelViewSet
Django Rest Framework(DRF)ではModelViewSet
というクラスが用意されています.これを使うと基本的なAPIViewをまとめて一発で実装できます.
また,ModelViewSet
を使えば,urls.py
に記述する各メソッドのエンドポイントもrest_framework.routers
クラスを使って簡単に実装できるようになります.安定したURI設計にも役立ちますね.
可読性も良くなります.
ModelViewSet
には以下のメソッドが実装されています.
.list() # 全件取得
.retrieve() # 1件取得
.create() # 作成
.update() # 更新
.partial_update() # 部分更新
.destroy() # 削除
部分的に利用したい
この中で一部のメソッドだけ実装したい場合どうしようとなりました.
APIViewで必要なメソッドだけを選んで逐一実装して行く方法があると思います.しかし今回はViewSetの良さを活かしたいです.
つまり例えば以下のクラス
class HogeViewSet(viewsets.ModelViewSet):
Createできないようにしたい場合,CreateAPIView
以外のものを書く
↓
class HogeListView(generics.ListAPIView):
class HogeRetrieveView(generics.RetrieveAPIView):
class HogeUpdateView(generics.UpdateAPIView):
class HogeDeleteView(generics.DestroyAPIView):
クラス数が増える! urls.py
の行数も増える!可読性も下がりそう!
そのままの感じでどうにかできないだろうか.
ということが今回の記事の内容です.
ModelViewSetの中身
Djangoのカスタマイズをしたい場合Githubのレポジトリを見ればいいと考えています.リファレンスももちろん見ます.
DRFのレポジトリを確認します.
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
ModelViewSetはGenericViewSetとmixinを多重継承して実装されているだけなのです.
不要なmixinを削れば良い
答えはシンプルで不必要なmixinを消せばよいということです.
例えば自作のユーザーモデルについて,ユーザー作成(create)は他の方法(django-allauthとか)で実装したいけどそれ以外の処理は一つにまとめておきたい.そういうモデルビューを作成したい時に今回のやりかたを使いました.
from .models import CustomUser
from .serializer import CustomUserSerializer
from rest_framework import viewsets
class CustomUserViewSet(viewsets.ModelViewSet):
queryset = CustomUser.objects.all()
serializer_class = CustomUserSerializer
.
.
.
↓
from .models import CustomUser
from .serializer import CustomUserSerializer
from rest_framework import viewsets, mixins
# mixins.CreateModelMixinを継承していないのでcreate()はできない.
class CustomUserViewSet(
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
viewsets.GenericViewSet):
queryset = CustomUser.objects.all()
serializer_class = CustomUserSerializer
.
.
.
できた.
まとめ
- ViewSetはまとめてくれて便利
- ModelViewSetはModelmixinとGenericViewSetを継承している.
- メソッドを削減したいならmixinを削ればいい.
見返すとたいした内容ではないのですが
DRFに関する日本語の情報はあまりないので少しでも誰かの役に立てばなあと思います.
何かあればご指摘お願いします.
以上です.ありがとうございました!
Author And Source
この問題について(Django REST framework (DRF) でModelViewSetを部分的に使いたい), 我々は、より多くの情報をここで見つけました https://qiita.com/checche/items/e256a0e437772a46b7a1著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .