普段、インターンで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アクションが呼ばれる仕組みは下記の通りだ。
- GenericAPIViewはAPIViewを継承しているためGetリクエストなどが送られたらget()メソッドが呼ばれる
- 汎用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の教科書」