Skip to content

APIモード

Djangoには、デフォルトで「APIモード」という特別な設定があるわけではありません。DjangoAPIとして機能させるためには、**Django REST FrameworkDRF)**のようなライブラリを組み合わせて使用することが一般的です。これにより、ウェブサイトの機能とAPI機能を共存させたり、API専用のバックエンドを構築したりすることができます。

APIモードの主要コンポーネント

Section titled “APIモードの主要コンポーネント”

DjangoAPIを構築する際は、以下の主要なコンポーネントを理解することが重要です。

  1. シリアライザー(Serializer

    • シリアライゼーション: モデルインスタンスをJSON形式に変換し、レスポンスとして返す。
    • デシリアライゼーション: JSON形式のデータを受信し、モデルインスタンスに変換してデータベースに保存する。
    • バリデーション: 受信したデータが正しい形式かどうかを検証する。
  2. ビュー(View

    • リクエスト処理: GETPOSTPUTDELETEなどのHTTPリクエストを処理。
    • データ取得・保存: モデルを操作してデータベースからデータを取得したり、保存したりする。
    • レスポンス生成: シリアライザーを使ってデータを整形し、レスポンスを返す。
  3. ルーティング(Routing

    • URLパターンとビューを結びつける。
    • エンドポイントを論理的にグループ化する。

DjangoAPIとして利用する主なユースケースは以下の通りです。

  • SPASingle Page Application)のバックエンド: ReactVue.jsAngularといったフロントエンドフレームワークと連携し、データを提供するAPIサーバーとして機能します。
  • モバイルアプリケーションのバックエンド: iOSAndroidアプリにデータを供給するためのAPIを構築します。
  • マイクロサービス: 複数のサービスが連携するアーキテクチャにおいて、他のサービスにデータや機能を提供するAPIとして利用されます。

これらのコンポーネントを組み合わせることで、Djangoは柔軟かつ強力なAPIバックエンドとして機能し、多様なクライアントからのデータ要求に応えることができます。

ここでは、簡単なブログアプリケーションを想定し、「記事(Article)」データを操作するAPIを作成します。

  1. モデルの定義

    • APIで扱うデータを定義するDjangoモデルを作成します。
    blog/models.py
    from django.db import models
    class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    is_published = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    def __str__(self):
    return self.title
  2. シリアライザーの作成

    • モデルをJSON形式に変換するためのシリアライザーを作成します。ModelSerializerを使うと、モデルのフィールドを自動的にマッピングしてくれます。
    blog/serializers.py
    from rest_framework import serializers
    from .models import Article
    class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
    model = Article
    fields = ['id', 'title', 'content', 'is_published', 'created_at']
  3. ビューの作成

    • APIのリクエストを処理するビューを作成します。ここでは、DRFの汎用ビューを使用し、CRUD(作成、読み取り、更新、削除)操作を簡潔に実装します。
    blog/views.py
    from rest_framework import generics
    from .models import Article
    from .serializers import ArticleSerializer
    # 記事のリスト表示と新規作成
    class ArticleListCreateView(generics.ListCreateAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    # 特定の記事の取得、更新、削除
    class ArticleRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
  4. URLルーティングの設定

    • APIのエンドポイントを定義します。これにより、特定のURLパターンが対応するビューと紐付けられます。
    myproject/urls.py
    from django.urls import path
    from blog.views import ArticleListCreateView, ArticleRetrieveUpdateDestroyView
    urlpatterns = [
    # APIのルートエンドポイント
    path('api/articles/', ArticleListCreateView.as_view(), name='article-list'),
    # IDを指定して特定の記事を操作するエンドポイント
    path('api/articles/<int:pk>/', ArticleRetrieveUpdateDestroyView.as_view(), name='article-detail'),
    ]

このコードをデプロイすると、以下のAPIエンドポイントが利用可能になります。

Terminal window
- **GET /api/articles/**: すべての記事をリストで取得します。
- **POST /api/articles/**: 新しい記事を作成します。
- **GET /api/articles/<id>/**: 特定の記事を取得します。
- **PUT /api/articles/<id>/**: 特定の記事を更新します。
- **DELETE /api/articles/<id>/**: 特定の記事を削除します。

DRFのブラウザブルAPI機能のおかげで、これらのエンドポイントにウェブブラウザから直接アクセスし、簡単に動作を確認できます。

DjangoにおけるAPI開発:Django REST Framework (DRF) の活用

Section titled “DjangoにおけるAPI開発:Django REST Framework (DRF) の活用”

Django自体には「APIモード」という特別な設定はありません。DjangoAPIバックエンドとして機能させるためには、**Django REST Framework (DRF)**のようなライブラリを統合して使用するのが一般的です。DRFは、Webサイトの機能とAPI機能を共存させたり、API専用のバックエンドを構築したりする際に非常に強力なツールとなります。

  1. API開発の主要コンポーネント

    • DjangoAPIを構築する際は、以下の3つの主要なコンポーネントが相互に連携します。

    • シリアライザー: Djangoモデルのインスタンス(Pythonオブジェクト)と、APIで扱うJSONなどのデータ形式との間で変換を行います。これにより、データのバリデーション(検証)と整形を効率的に行えます。

    • ビュー: APIリクエストを処理し、シリアライザーを使ってレスポンスを生成します。DRFの汎用ビューは、一般的なCRUD(作成、読み取り、更新、削除)操作を簡単に実装できるように設計されています。

    • ルーティング: 特定のURLと、そのリクエストを処理するビューを結びつけます。これにより、APIのエンドポイントを整理し、論理的なURL構造を設計できます。

  2. 具体的な実装例:ブログAPIの構築

    • 簡単なブログアプリケーションを想定し、「記事(Article)」データを操作するAPIを作成する手順は以下の通りです。

    • モデルとシリアライザーの定義

      • APIで扱うデータの構造をArticleモデルで定義し、そのデータをJSONに変換するためのArticleSerializerを作成します。
      blog/models.py
      from django.db import models
      class Article(models.Model):
      # ... モデルの定義 ...
      # blog/serializers.py
      from rest_framework import serializers
      from .models import Article
      class ArticleSerializer(serializers.ModelSerializer):
      class Meta:
      model = Article
      fields = ['id', 'title', 'content', 'is_published', 'created_at']
    • ビューとURLの設定(手動での方法)

      • DRFの汎用ビューを使って、記事の一覧/作成 (ArticleListCreateView) と、詳細/更新/削除 (ArticleRetrieveUpdateDestroyView) の2つのビューを定義します。その後、urls.pyでそれぞれのビューにURLを割り当てます。
      blog/views.py
      from rest_framework import generics
      from .models import Article
      from .serializers import ArticleSerializer
      class ArticleListCreateView(generics.ListCreateAPIView):
      queryset = Article.objects.all()
      serializer_class = ArticleSerializer
      class ArticleRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
      queryset = Article.objects.all()
      serializer_class = ArticleSerializer
      # myproject/urls.py
      from django.urls import path
      from blog.views import ArticleListCreateView, ArticleRetrieveUpdateDestroyView
      urlpatterns = [
      path('api/articles/', ArticleListCreateView.as_view()),
      path('api/articles/<int:pk>/', ArticleRetrieveUpdateDestroyView.as_view()),
      ]

      この方法では、CRUD操作ごとに異なるビューを定義し、それぞれにURLを設定する必要があります。

  3. ビューセットとルーターによる開発の簡素化

    • 上記の手動設定は、ビューセットとルーターを使用することで大幅に簡素化できます。

    • ビューセット: 複数のAPIエンドポイント(一覧表示、詳細表示、作成、更新、削除など)のロジックを一つのクラスにまとめます。ModelViewSetは、CRUD操作をすべて自動で提供するため、最もよく使われます。

    • ルーター: ビューセットを自動的に分析し、対応するURLを自動生成します。

    • ビューセットとルーターを使った実装

      • ArticleViewSetという単一のビューセットクラスを定義し、これをDRFのルーターに登録するだけで、複数のURLが自動生成されます。
      blog/views.py
      from rest_framework import viewsets
      from .models import Article
      from .serializers import ArticleSerializer
      # ModelViewSetは、CRUD操作をすべて自動で提供
      class ArticleViewSet(viewsets.ModelViewSet):
      queryset = Article.objects.all()
      serializer_class = ArticleSerializer
      # myproject/urls.py
      from django.urls import path, include
      from rest_framework.routers import DefaultRouter
      from blog.views import ArticleViewSet
      # ルーターをインスタンス化
      router = DefaultRouter()
      # ビューセットをルーターに登録
      router.register(r'articles', ArticleViewSet)
      urlpatterns = [
      # ルーターが生成したURLをインクルード
      path('api/', include(router.urls)),
      ]

      この設定だけで、GET /api/articles/POST /api/articles/GET /api/articles/<pk>/PUT /api/articles/<pk>/DELETE /api/articles/<pk>/といったすべてのCRUDエンドポイントが自動的に利用可能になります。

ビューセットとルーターの組み合わせは、DRFの強力な機能の一つであり、API開発を劇的に効率化します。これにより、開発者はよりビジネスロジックに集中できるようになります。