👋

Django Rest Framework(DRF)の基本的な実装

2024/09/29に公開

最近CourseraMeta Backend Developper Certificateと言うプログラムに参加しているのですが、そこでDjangoを使ってバックエンドについて学んでいます。ここでは自分のメモに近いのですが、Django Rest Frameworkを使ってAPIのプレビュー画面を表示してDBを操作できるところまでをまとめます。

なお、普段はFlutterでの開発がメインであり、バックエンドは詳しくありません。ご了承ください。

Courseraとは

学習プラットフォームです。大学の講義などを受講できるのですが、GoogleやMeta、IBMなど企業によるものもあり、コースを終了すると修了証がもらえます。なお、内容は全部英語ですが、適宜AI使って対処しています。

Coursera及びMeta Backend Developper Certificateについてはこちらです。
https://www.coursera.org/professional-certificates/meta-back-end-developer

Django Rest Framework(DRF)とは

Django Rest Framework(DRF)は、DjangoでRESTful APIを作成するための拡張フレームワークです。通常のDjangoはフルスタックフレームワークとしてWebアプリケーションを構築できますが、DRFはAPIの構築に特化しています。

特徴

他のバックエンドフレームワークを学んでないので比較できないのですが、学習の中で触れていた特徴としては以下の通りです。

  • シリアライズ: モデルインスタンスをJSONなどのフォーマットに変換可能
  • CRUD操作: データの作成、読み取り、更新、削除を簡単に実装
  • APIプレビュー画面: ブラウザからAPIのエンドポイントを試せるプレビュー画面を提供

この記事でのゴール

前述のAPIのプレビュー画面を表示するところまで実装します。

私の作業環境

M1Pro:MacbookPro(2021)
python:Python3.12(Homebrew経由でインストール)

基本の作業工程

  • pipenvで仮想環境を作成
  • projectとappを作成
  • settings.pyのINSTALLED_APPSを整理
  • projectのurlpatternにアプリの分を追加
  • appにurls.pyを追加
  • appのviews.pyを追加
  • appのmodels.pyを整理
  • appにserializers.pyを追加

作業的には太字になっている4つのファイル編集が大事だと考えています。

実装

仮想環境を作成

pipenv shell
pipenv install

projectとappを作成

django-admin startproject {任意のproject名}
cd {任意のproject名}
python manage.py startapp {任意のapp名}

settings.pyのINSTALLED_APPSを整理

作成したproject内にsettings.pyファイルがあるので、その中のINSTALLED_APPSを編集します。
具体的にはDRFを追加します。

project/project/settings.py
INSTALL_APP =[
    {任意のproject名},
    'rest_framework',
]

projectのurlpatternにアプリの分を追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('{任意のproject名}.urls')) # 追加
]

ここまでで基本的な準備が終わりました。ここからがAPIサーバーを作るための作業になります。

appにurls.pyを追加

ファイルの説明をします。
役割: URLパターンを定義し、各エンドポイントに対応するビューを指定します。
詳細: クライアントのリクエストがどのビューにルーティングされるかを決定します。

from django.urls import path
from . import views

urlpatterns = [
    path('books/', views.BookView.as_view()),
    path('books/<int:pk>/', views.SingleBookView.as_view()),
]

appのviews.pyを追加

ファイルの説明をします。
役割: リクエストを処理し、レスポンスを返すロジックを定義します。
詳細: 使用するシリアライザを指定し、データの取得、作成、更新、削除を行います。

from rest_framework import generics
from .models import MenuItem
from .serializers import MenuItemSerializer

# ~/api/book-menuで表示
class MenuItemsView(generics.ListCreateAPIView):
    queryset = MenuItem.objects.all()
    serializer_class = MenuItemSerializer

# ~/api/book-menu/{任意のprimaryKey}で表示
class SingleMenuItemView(generics.RetrieveUpdateDestroyAPIView):
    queryset = MenuItem.objects.all()
    serializer_class = MenuItemSerializer

generics.ListCreateAPIViewではListで、レコードの一覧取得ができ、新規追加もできます。
generics.RetrieveUpdateDestroyAPIViewでは、個別のレコードの編集や削除ができます。

appのmodels.pyを整理

ファイルの説明をします。
役割: データベースのテーブル構造を定義します。
詳細: モデルクラスがデータベースのテーブルに対応し、属性や制約を定義します。

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=5, decimal_places=2)

appにserializers.pyを追加

ファイルの説明をします。
役割: モデルインスタンスをJSONなどのフォーマットに変換
詳細: モデルを基にデータをシリアル化し、検証や変換を行う

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book // BookモデルのSerializerとして定義
        fields = ['title', 'author', 'price']
        extra_kwargs = {
            'price': {'min_value': 2}, # 入力値の制限
            'inventory': {'min_value': 0}, # 入力値の制限
        }

サーバー起動

必要な編集は終わりました。migrationを行った上でサーバーを起動しましょう。

python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py runserver

こちらのurlで表示されるかと思います。
http://127.0.0.1:8000/api/menu-items

データを作成した後個別のmenu-item画面に映って、編集を削除をしています。途中真っ暗になりますが、多分プラグインの影響かと思います。

https://x.com/osanaiks10512/status/1840296704714912153

まとめ

APIサーバーとして最低限の形ができました。初めてDRFに触れる人の参考になればと思います。引き続き、学習に取り組んでいきたいと思います

Discussion