LoginSignup
26
14

More than 3 years have passed since last update.

Django ModelViewSetの使い方

Last updated at Posted at 2020-10-25

ModelViewSetとは

モデルに対する、一覧取得詳細取得新規作成更新削除
一括で作成してくれます😃

ReadOnlyModelViewSetを継承すれば、一覧取得と詳細取得だけにできる😃😃

基本的な使い方

書き方

使い方の注意は、urls.pyにパス追加する方法が、APIViewなどとは少し違うということ!

book/views.py

from rest_framework import generics, viewsets

class BookViewSet(viewsets.ModelViewSet):
    serializer_class = BookSerializer
    queryset = Book.objects.all()

book/urls.py
from rest_framework import routers

router = routers.DefaultRouter()
router.register('books', BookViewSet)

確認する

terminal

curl http://127.0.0.1:8000/api/v1/book/books/
[{"id":"a088ae31-dbe4-4435-8dc9-356378b6def9","is_deleted":"0","created_at: ...."}]

curl http://127.0.0.1:8000/api/v1/book/books/<pkをいれる>/
{"id":"a088ae31-dbe4-4435-8dc9-356378b6def9","is_deleted":"0"," ....."}

curl -XPOST http://127.0.0.1:8000/api/v1/book/books/ -d "title=test&sub_titl..."
{"id":"fc21044e-7388-4391-b498-8b472350282f","is_deleted":"0"...}

curl -XPATCH  http://127.0.0.1:8000/api/v1/book/books/<pk>/ -d 'is_deleted=1'
{"id":"a088ae31-dbe4-4435-8dc9-356378b6def9","is_deleted":"1"," ....."}

curl -XDELETE  http://127.0.0.1:8000/api/v1/book/books/<pk>/

無事にできました😃

カスタマイズする

actionデコレータ

これは絶対に覚えておきたいと思うので最初に書きます!
urlに追加してくれて、機能を追加してくれます☺️

例:

views.py

class BookViewSet(viewsets.ModelViewSet):
    serializer_class = BookSerializer
    queryset = Book.objects.all()

    @action(detail=True, methods=['get'])
    def authors(self, request, pk=None):
        author = Author.objects.all()
        serializer = AuthorSerializer(author, many=True)
        return Response(serializer.data)

このように書きます!

もちろん、こんな感じの機能は追加することはないでしょうが笑
ということでAPIを確認します!😃

terminal

curl http://127.0.0.1:8000/api/v1/book/books/1/authors/
[{"id":"a739d3f5-a170-4472-a7af-33a44f8f5512","is_deleted":"0"...}]

detailとは、一覧APIなのか詳細APIなのかを判断しています。(Trueだと詳細)
一覧APIの場合は、引数のpkは入りません。!

methodsとは、HTTPメソッドを定義しています。(get, post, put, patch,delete)
※複数も可能methods=['get', 'patch']

認証の設定

APIViewなどのように認証の設定も可能です

views.py
class BookViewSet(viewsets.ModelViewSet):
    serializer_class = BookSerializer
    queryset = Book.objects.all()
    authentication_classes = [IsAccountAdminOrReadOnly]

actionデコレータでも可能!

views.py
@action(detail=True, methods=['post'], permission_classes=[IsAccountAdminOrReadOnly])

フィルターの設定

rest_frameworkのfiltersを使ってみる😃

views.py

from rest_framework import filters

class BookViewSet(viewsets.ModelViewSet):
    serializer_class = BookSerializer
    queryset = Book.objects.all()
    filter_backends = [filters.SearchFilter]
    search_fields = ['sub_title','title']

確認する!
?serach=検索文字列で検索できる☺️

terminal
curl http://127.0.0.1:8000/api/v1/book/books/?search=設計・運用計画の鉄則

[{"id":"a088ae31-dbe4-4435-8dc9-356378b6def9","is_deleted":"0" ... ,"sub_title":"設計・運用計画の鉄則" ...}]

無事に取得できました😃😃😃

使わないHTTPメソッドを省く

ViewSetを使うと、DELETEとか使わないのにあるからデータ消されちゃう😭😭😭😭
その対策は、継承を変更すれば大丈夫!!!

views.py

from rest_framework import mixins

class AuthorViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):

この場合は作成と一覧のみ!!

mixins.CreateModelMixin
mixins.RetrieveModelMixin
mixins.UpdateModelMixin
mixins.DestroyModelMixin
mixins.ListModelMixin

使うものを継承する😃😃😃😃😃😃

以上!!!
お疲れ様です!!😃😃

公式サイトはこちらです!!!!!

26
14
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
26
14