Django REST framework 初級から上級まで

By datnq, at: 2023年12月19日17:03

Estimated Reading Time: __READING_TIME__ minutes

Django rest framework from beginner to advance
Django rest framework from beginner to advance

 

RESTful APIの基本から始め、シリアライザ、認証について理解し、最終的には高度な課題に深く踏み込みます。実践的な洞察と具体的な例を用いて、この記事は豊かな学習体験を提供し、Django Rest Frameworkを段階的に習得するお手伝いをします。今日から初心者から上級者への冒険を始めましょう!

 

1. 基本的なapiの作成、ストリーミングの実行

 

drfにおける基本的なapiの主要コンポーネントは、シリアライザとビューの2つの部分で構成されます。ライブラリのインポートとすべての設定が完了したら、GETメソッドを使用して本のすべてのデータを取得する基本的なapiを作成したいとします。シリアライザを使用すると:

 
from app.models import Book
from rest_framework import serializers


class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['name', 'author', 'rate']


DRFのシリアライザは、PythonコードからJSONへのシリアライズとデシリアライズをサポートします。ここでは、UserSerializerがname、author、rateフィールドを含むAPI結果を返します。

DRFにおけるビューは、プロパティを通じてAPIにアクセスする方法です。

 
from app.models import Book
from rest_framework import permissions, viewsets
from app.serializers import BookSerializer

class UserViewSet(viewsets.ModelViewSet):
    serializer_class = BookSerializer
    permission_classes = [permissions.IsAuthenticated]


シンプルなビューを使用することで、DRFは上記のBookSerializerに従って書籍データを提供するAPIを作成しました。permission_classes属性は、APIを実行する際にユーザー認証が必要であることを宣言します。

 

2. シリアライザのカスタムフィールドとバリデーション

 

モデル内のフィールドを使用することに加えて、ユーザーは自分で作成したフィールドに基づいてAPI結果を返すこともできます。

 

class BookSerializer(serializers.ModelSerializer):
    date_publish = serializers.SerializerMethodField()

    class Meta:
        model = Message
        fields = ['name', 'author', 'rate', 'date_publish']
        
    def get_date_publish(self, obj):
        """
        公開日の結果のためのロジックコード
        """
    


シンプルなビューを使用することで、DRFは上記のBookSerializerに従って書籍データを提供するAPIを作成しました。allow_classes属性は、APIを実行する際にユーザーによる認証が必要なターゲットを宣言します。

 

3. シリアライザのカスタムフィールドとバリデーション

 

モデルで使用可能なフィールドに加えて、ユーザーは自動生成されたフィールドに基づいてAPI結果を返すこともできます。

 

class BookSerializer(serializers.ModelSerializer):
    date_publish = serializers.SerializerMethodField()

    class Meta:
        model = Message
        fields = ['name', 'author', 'rate', 'date_publish']
        
    def get_date_publish(self, obj):
        """
        公開日の結果のためのロジックコード
        """
    


各書籍データについて、date_publishはget_date_publish関数によって返される任意の依存値と同じ値を持ちます。
さらに、比率が妥当な値かどうかを検証する必要があります。DRFもこれをサポートしています。簡単な例として、書籍の値の計算には0より大きく5より小さい値が必要です。BookSerializerクラスに対して、戻り値の比率をチェックする関数を追加する必要があります。

 
def validate_rate(self, value):
    if value < 0 or value > 5:
        raise serializers.ValidationError("Error")
    return value


DRFはシリアライザを強力にサポートしており、ユーザーは自由にシリアライザを作成できます。

 

4. ビューの比較

 

ビューとビューについて、初心者には作業においてかなりの自由度があり、使用する適切なAPIの種類を選択できます。より簡単に観察できるように作成された比較表を以下に示します。

 

ビュータイプ ユースケース
function view 基本的なビュータイプで、作成と理解が容易です。ただし、規則に従わないため、後でコードを維持することが難しく、用途が制限されます。
class APIView function viewと同じメカニズムを持ち、クラスがリクエストに応答する多くの属性メソッドをサポートする点が改良されており、メンテナンスが容易になり、.get()や.post()など、より具体的な機能をいくつかサポートします。しかし、依然として多くの制限があります。
class GenericAPIView drfの優れた改良点の1つであるGenericAPIViewは、APIを作成するために非常に優れたクラスです。GenericAPIViewを使用する際に言及しなければならないハイライトは、クエリセットの使用を許可し、個別のserializer_classへのマッピングを許可し、特にmixinを使用できることです。これはDjangoのジェネリックなクラスベースビューを彷彿とさせます。さらに、具体的なビュークラスを使用してAPIを簡素化できます(たとえば、モデルに対してGET APIが1つしかない場合、GenericAPIViewを使用する代わりにListAPIViewを使用できます)。
class ViewSet APIViewクラスに似ていますが、一般的な関数.get()、.post()の代わりに、ViewSetは.list()と.create()の2つのメソッドを指定します。viewsetsの長所は、上記のビューのようにURLを手動で作成するのではなく、登録に従ってURLを自動的に宣言することです。
function GenericViewSet GenericAPIViewに似ており、登録に従ってURLを自動的に生成できます。
class ModelViewSet GenericViewSetに似ており、URLの自動生成をサポートし、.list()、.retrieve()、.create()、.update()、.partial_update()、.destroy()を追加でサポートします。

 

5. カスタムアクション

 

ご存じのとおり、viewsetはURLの自動生成をサポートしています。

 

from app.models import Book
from app.serializers import BookSerializer
from rest_framework import viewsets


class BookViewSet(viewsets.ViewSet):
     def list(self, request):
         queryset = Book.objects.all()
         serializer = BookSerializer(queryset, many=True)
         return Response(serializer.data)


上記は、すべての書籍データを取得するAPIを作成するViewSetの簡単な例です。このAPIのエンドポイントを宣言するには、urls.pyに以下を追加するだけです。

router.register(r'books', BookViewSet, basename='book')


上記のコードは、BookViewSetクラスのAPIを自動的に宣言するのに役立ちます。必要な特定のAPIを作成したい場合は、DRFにこれをサポートするためのextra_actionがあります。

 
@action(detail=True, methods=["get"], name="Example")
def example(self, request, pk=None):
     """ロジックコードはこちら"""
     ...

 

これで、ユーザーはGETメソッドを使用してbooks/exampleというAPIを持つことになります。

 

6. フィルタ、カスタムパーミッション、認証の使用

 

これで、フレームワーク、APIの登録方法、適切なビューの選択方法、シリアライザの設計方法について、より深く理解できたと思います。各APIには、常にフィルタとユーザー認証の設定があります。この記事の最後に、要件に応じてフィルタ、パーミッション、認証を作成する簡単な方法をいくつかご紹介します。

 

6.1. フィルタを使用:

 

以下のような特別な利用可能なフィルタバックエンドを使用できます。

 

 

6.2. パーミッションと認証を使用:

 

必要に応じて使用するBasePermissionとBaseAuthentication関数をオーバーライドします。

例:

 
from rest_framework.permissions import BasePermission


class ExamplePermission(BasePermission):
     def has_permission(self, request, view):
     """
     ロジックコードはこちら、成功した場合はTrueを、そうでない場合はFalseを返します。
     """

 

結論

 

このガイドでは、基本的なAPIの設定からシリアライザのカスタマイズ、さまざまなビュータイプの理解まで、Django Rest Frameworkの基本を説明しました。これらの手順と例に従うことで、DRFの基礎を固め、より高度なトピックに取り組む準備が整うはずです。

より複雑なシリアライザ、カスタム認証メカニズム、パフォーマンス最適化技術など、高度なDRF機能についてさらに詳しく説明するパート2にご期待ください。学び続けて、探求し続けてください!

Tag list:
- API
- restful
- rest api
- django
- views
- validations
- RESTFUL Django
- django rest framework
- serializers
- DRF

Subscribe

Subscribe to our newsletter and never miss out lastest news.