Django Rest Framework(DRF)の基本的な実装
最近Coursera
のMeta Backend Developper Certificate
と言うプログラムに参加しているのですが、そこでDjangoを使ってバックエンドについて学んでいます。ここでは自分のメモに近いのですが、Django Rest Frameworkを使ってAPIのプレビュー画面を表示してDBを操作できるところまでをまとめます。
なお、普段はFlutterでの開発がメインであり、バックエンドは詳しくありません。ご了承ください。
Courseraとは
学習プラットフォームです。大学の講義などを受講できるのですが、GoogleやMeta、IBMなど企業によるものもあり、コースを終了すると修了証がもらえます。なお、内容は全部英語ですが、適宜AI使って対処しています。
Coursera及びMeta Backend Developper Certificateについてはこちらです。
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を追加します。
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画面に映って、編集を削除をしています。途中真っ暗になりますが、多分プラグインの影響かと思います。
まとめ
APIサーバーとして最低限の形ができました。初めてDRFに触れる人の参考になればと思います。引き続き、学習に取り組んでいきたいと思います
Discussion