見出し画像

DRF_DRFとは & APIView関連メソッドについて # 166日目

Django REST Framework(以下DRF)の勉強を開始しています。
本日は基礎的なAPIの開発方法を整理したいと思います。


Django REST Frameworkとは

そもそもDRFとは何かですが、これはDjangoを使ってREST APIを開発するためのフレームワークです。REST APIについては前回まとめました。

Djangoがベースになっているので、Djangoがインストールされている方は、まず以下のコマンドでDRFをインストールします。

pip install djangorestframework

インストール完了後、Djangoのsettings.pyのAPPに「rest_framework」を追加すれば使用開始できます。

[settings.py]
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
]



rest_framework.genericsのAPIView関連メソッド

APIViewはデータベースへのCRUD(作成、読み込み、更新、削除)を機能別に作成できるメソッドです。Djangoで普段使用する「views.py」というファイルの代わりに「api.py」というAPI専用ファイルを作成して定義します。

この手法だと、urls.pyに直接「api.py」を指定してAPIを実装できます。

また、わざわざ「機能別」と記載したのは、別で存在するViewSet関連のメソッドではこれをまとめて実装できるためです。ViewSet関連のメソッドでは「ルーティング」という処理も必要になる等、APIViewとはまた違った特徴があるため、今回とは別にまとめます。

APIViewメソッドには、例えば以下のようなものがあります。

ListCreateAPIView
データベースの任意のカラムのデータを一覧で取得するビューです。

RestrieveAPIView
データベースのデータを条件指定して取得するビューです。URLにインデックス番号などを指定することで条件指定できます(urls.pyで指定するURLもそれに合わせたものにしておく必要があります)。

上記以外にも色々あります。

出典:DXCEL WAVE

DRF特有で、関連するファイルは「models.py」「serializers.py」「api.py」「urls.py」です。

まずmodels.pyは普段のDjangoと同様に定義します。

[models.py]
from django.db import models

class SampleModel(models.Model):
    title       = models.CharField(max_length = 100)
    description = models.CharField(max_length = 300)

    def __str__(self):
        return self.title

次にserializers.pyです。これはデータベースから取り出したモデルのオブジェクトをJSONにserializeしたり、ユーザーからPOST等で送られたJSONをdeserializeするためのクラスです。

[serializers.py]
from rest_framework import serializers                 # APIの出力をJSON,XMLデータに変換
from .models import SampleModel

class SampleSerializer(serializers.ModelSerializer):
    class Meta:
        model  = SampleModel                           # 呼び出すモデル
        fields = ["id", "title", "description"]        # API上に表示するモデルのデータ項目

続いてapi.pyです。Djangoでのviews.pyに相当します。アプリケーションフォルダ内に作成するAPI専用ファイルです。まずは「ListCreateAPIView」を使ってみます。

[api.py]
from .models import SampleModel
from rest_framework.generics import ListCreateAPIView
from .serializers import SampleSerializer


class api(ListCreateAPIView):
    queryset           = SampleModel.objects.all()   # 対象とするモデルのオブジェクトを定義(この名前じゃないと動かない)
    serializer_class   = SampleSerializer            # APIがデータを返すためのデータ変換ロジックを定義(この名前じゃないと動かない)
    permission_classes = []                          # 認証。アクセス権を付与したい場合はここに設定する(必須ではないが使う場合は多分この名前じゃないと動かない)

最後にurls.pyです。api.pyを直接指定できます。

[urls.py]
from django.urls import path
from . import apis

urlpatterns = [
    path('', apis.api.as_view(), name = "api"),
]


続けて「RetrieveAPIView」を使ってみます。これは条件指定して、必要なデータだけを取得することができます。api.pyとurl.pyだけ変更します。

[apis.py]
from .models import SampleModel
from rest_framework.generics import RetrieveAPIView
from .serializers import SampleSerializer


class api(RetrieveAPIView):
    queryset           = SampleModel.objects.all()
    serializer_class   = SampleSerializer
    permission_classes = []

url.pyではpk (=primary key)を指定して該当番号のデータを取得するように設定しています。

[url.py]
from django.urls import path
from . import apis

urlpatterns = [
    path('<int:pk>', apis.api.as_view(), name = "api")
]


これで以下のような画面が表示されればOKです。


これまでAPIは使ったことしかありませんでしたが、こうやって自分で作成できるとこれはまた面白いですね。

ここまでお読みいただきありがとうございました!


参考


この記事が気に入ったらサポートをしてみませんか?