プログラミング初心者でも安心!Django REST Frameworkの汎用表示ビュー入門


汎用表示ビューは、APIにおける一般的な操作を処理する事前定義されたビュークラスです。これらのビュークラスは、データベースモデルとの連携、認証、フィルタリング、ページネーションなどの機能を提供します。開発者は、これらのクラスを継承して、独自のAPIロジックを実装することができます。

汎用表示ビューの種類

DRFは以下の汎用表示ビューを提供しています。

  • DestroyAPIView
    個々のオブジェクトを削除します。
  • UpdateAPIView
    個々のオブジェクトを更新します。
  • CreateAPIView
    新しいオブジェクトを作成します。
  • RetrieveAPIView
    個々のオブジェクトを表示します。
  • ListAPIView
    クエリセットのリストを表示します。

汎用表示ビューの使い方

汎用表示ビューを使用するには、まず必要なビュークラスをインポートします。次に、ビュークラスを継承したクラスを作成し、必要なメソッドをオーバーライドします。

from rest_framework.generics import ListAPIView, RetrieveAPIView, CreateAPIView, UpdateAPIView, DestroyAPIView

class MyListAPIView(ListAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

class MyRetrieveAPIView(RetrieveAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

class MyCreateAPIView(CreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

class MyUpdateAPIView(UpdateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

class MyDestroyAPIView(DestroyAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

この例では、MyModelモデル用のAPIビューを作成しています。ListAPIViewを使用してモデルのリストを表示し、RetrieveAPIViewを使用して個々のオブジェクトを表示し、CreateAPIViewを使用して新しいオブジェクトを作成し、UpdateAPIViewを使用して個々のオブジェクトを更新し、DestroyAPIViewを使用して個々のオブジェクトを削除します。

汎用表示ビューを使用する利点は次のとおりです。

  • テストを容易にする
    汎用表示ビューは、テストしやすいように設計されています。
  • 一貫性を保つ
    汎用表示ビューを使用すると、API全体で一貫したコードスタイルを維持することができます。
  • コードを簡潔にする
    汎用表示ビューを使用すると、コードをより簡潔にすることができます。
  • 開発時間を短縮
    汎用表示ビューは、APIにおける一般的な操作を処理する事前定義されたロジックを提供するため、開発時間を短縮することができます。

Django REST Frameworkの汎用表示ビューは、API開発を効率化するための強力なツールです。これらのビュークラスを使用すると、開発時間を短縮し、コードを簡潔にし、一貫性を保ち、テストを容易にすることができます。



from rest_framework import generics
from .models import Book
from .serializers import BookSerializer

class BookListAPIView(generics.ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

class BookRetrieveAPIView(generics.RetrieveAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

class BookCreateAPIView(generics.CreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

class BookUpdateAPIView(generics.UpdateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

class BookDestroyAPIView(generics.DestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

このコードは次のようになります。

  • BookDestroyAPIViewpkが指定されたBookオブジェクトを削除します。
  • BookUpdateAPIViewpkが指定されたBookオブジェクトを更新します。
  • BookCreateAPIView:新しいBookオブジェクトを作成します。
  • BookRetrieveAPIViewpkが指定された単一のBookオブジェクトを表示します。
  • BookListAPIViewBookモデルのすべてのオブジェクトのリストを表示します。

このコードは基本的な例ですが、汎用表示ビューを使用してさまざまな種類のAPIを作成する方法を示しています。

汎用表示ビューは、ニーズに合わせてさらにカスタマイズすることができます。たとえば、次のことができます。

  • スロットリング
    throttle_classes属性を使用して、ビューへのリクエストをスロットリングすることができます。
  • 認証とパーミッション
    permission_classes属性を使用して、ビューへのアクセスを制御することができます。
  • フィルタリングとページネーション
    queryset属性を使用して、ビューで返されるオブジェクトをフィルタリングおよびページネーションすることができます。


手動でビューを作成する

汎用表示ビューを使用する代わりに、手動でビューを作成することができます。これは、より多くの制御が必要な場合や、汎用表示ビューでは提供されていない機能が必要な場合に役立ちます。

from rest_framework.views import APIView
from .models import Book
from .serializers import BookSerializer

class BookListView(APIView):
    def get(self, request):
        books = Book.objects.all()
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

class BookDetailView(APIView):
    def get(self, request, pk):
        try:
            book = Book.objects.get(pk=pk)
        except Book.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

        serializer = BookSerializer(book)
        return Response(serializer.data)

class BookCreateView(APIView):
    def post(self, request):
        serializer = BookSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class BookUpdateView(APIView):
    def put(self, request, pk):
        try:
            book = Book.objects.get(pk=pk)
        except Book.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

        serializer = BookSerializer(book, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class BookDeleteView(APIView):
    def delete(self, request, pk):
        try:
            book = Book.objects.get(pk=pk)
        except Book.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

        book.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

クラスベースビューを使用する

汎用表示ビューの代わりに、クラスベースビューを使用することができます。クラスベースビューは、より柔軟性と制御性があり、汎用表示ビューでは提供されていない機能を追加することができます。

from rest_framework.views import generic
from .models import Book
from .serializers import BookSerializer

class BookListView(generic.ListView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

class BookDetailView(generic.DetailView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

class BookCreateView(generic.CreateView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

class BookUpdateView(generic.UpdateView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

class BookDeleteView(generic.DeleteView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

カスタムロジックを使用する

汎用表示ビューやクラスベースビューを使用する代わりに、カスタムロジックを使用することができます。これは、より複雑なAPIが必要な場合や、既存のフレームワークでは提供されていない機能が必要な場合に役立ちます。

from rest_framework.response import Response
from .models import Book
from .serializers import BookSerializer

def book_list_view(request):
    books = Book.objects.all()
    serializer = BookSerializer(books, many=True)
    return Response(serializer.data)

def book_detail_view(request, pk):
    try:
        book = Book.objects.get(pk=pk)
    except Book.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    serializer = BookSerializer(book)
    return Response(serializer.data)

def book_create_view(request):
    serializer = BookSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.