Django REST Framework(DRF)でMixinとgenericsを使う


Mixinを使うことで今まで書いていた内容を省略できる。

serializers.py
from rest_framework import serializers
from ebooks.models import Ebook, Review

class ReviewSerializer(serializers.ModelSerializer):

    class Meta:
        model = Review
        fields = "__all__"

class EbookSerializer(serializers.ModelSerializer):
    reviews = ReviewSerializer(many=True, read_only=True)
    class Meta:
        model = Ebook
        fields = '__all__'
views.py
from rest_framework import generics
from rest_framework import mixins
from ebooks.models import Ebook
from .serializers import EbookSerializer

class EbookListCreateAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = Ebook.objects.all()
    serializer_class = EbookSerializer
    #querysetとserializer_classを定義

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs) #list

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs) #create

class EbookDetailAPIView(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    generics.GenericAPIView):
    queryset = Ebook.objects.all()
    serializer_class = EbookSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs) #retrieve

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs) #update

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs) #destroy

これをコピーしては貼るだけでrest apiが完成する。

urls.py
from django.urls import path
from .views import EbookListCreateAPIView, EbookDetailAPIView

urlpatterns = [
    path('ebooks/', EbookListCreateAPIView.as_view(), name="ebook-list"),
    path('ebooks/<int:pk>/', EbookDetailAPIView.as_view(), name="ebook-detail"),
]

これだけでとても簡単に実装できるんだなと思っていたがgenericsはこれを更に簡略している。

views.py
from rest_framework import generics
from rest_framework import mixins
from ebooks.models import Ebook
from .serializers import EbookSerializer

class EbookListCreateAPIView(generics.ListCreateAPIView): #list create
    queryset = Ebook.objects.all()
    serializer_class = EbookSerializer

class EbookDetailAPIView(generics.RetrieveUpdateDestroyAPIView): #retrieve update destroy
    queryset = Ebook.objects.all()
    serializer_class = EbookSerializer

とても簡単だが、これを最初に勉強すると何が何だかさっぱりわからない。
一からしっかりと覚えたほうがいいかもしれない。