0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Djangoのrest_frameworkのviewsの使い方をさらっとまとめてみた

Last updated at Posted at 2021-04-12

普段、インターンでDjangoのrest_frameworkを用いてAPIを作ったりしているので、アウトプットとして自分なりにまとめてみた。

APIView

APIViewはrest_frameworkの全てのViewクラスの継承元となるクラスである。リクエストのメソッド名と同じインスタンメソッドが呼ばれる。これらのメソッドは、DRFではハンドラメソッドと呼ばれる。この仕組みはdispatchメソッドによって実現されている。

参考記事
DjangoのView呼び出しの仕組み ~getメソッドはどう呼ばれるのか - りんごとバナナとエンジニア

getやpostメソッドは自前で用意する必要がある。

class ArticleAPI(views.APIView):
    # 一覧を返す
    def get(self, request, *args, **kwargs):
        articles = Article.objects.all()
        # リスト形式のJsonを出力する場合は、 「many=true」を指定する必要がある。
        serializer = ArticleSerializer(instance=articles, many=true)
        return Response(serializer.data, status.HTTP_200_OK)

    # 記事を作成する
    def post(self, request, *args, **kwargs):
        serializer = ArticleSerializer(data=request.data)  
        serializer.is_valid()
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
        

この他にも、putメソッドやdeleteメソッドを作成して更新や削除などの処理を作ることができる。

汎用APIView

汎用APIViewでは、CreateAPIViewやListAPIViewなどのビュークラスのことを言う。get()やpost()などのハンドルメソッドの代わりに**list()やcreate()**などのアクションメソッドが用意されてある。

下記がアクションメソッドの一覧である。
Viewsets - Django REST framework

単一モデルを対象とするREST APIを作るのであれば、対応するアクションに応じてCreateAPIViewなどを継承すればいいだろう。

listアクションやcreateアクションが呼ばれる仕組みは下記の通りだ。

  1. GenericAPIViewはAPIViewを継承しているためGetリクエストなどが送られたらget()メソッドが呼ばれる
  2. 汎用APIViewのgetメソッド内でlist()メソッドが呼ばれる。

実際のコード例

class ListAPIView(mixins.ListModelMixin,
                  GenericAPIView):
    """
    Concrete view for listing a queryset.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

api/users/の時はCreateListAPIViewを継承して、api/users/pk/の時はRetrieveUpdateDestroyAPIViewを継承したりなど、REST APIを容易に作ることができてかなり便利である。

ModelViewSet

ModelViewSetは、単一モデルのCRUD処理を用意に実現することができる。ModelViewSetもGenericAPIViewを継承しているため、汎用APIViewのようにリクエストとアクションを結びつけつることができる。

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

GitHubにも提供されるアクションメソッドの一覧が表記されている。

なお、CRUD処理以外の処理を実装したい時は、actionデコレーターを使うこともできる。
参考記事
Viewsets - Django REST framework

まとめ

参考記事

参考書籍

  • 「現場で使えるDjango REST Frameworkの教科書」
0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?