Django RESTful API


0、事前準備

  • Djangoを使用するにはPythonをインストールする必要があります.Python 3.4以降の
  • のインストール
    [~] → python3 --version
    Python 3.6.5
    [~] → pip3 --version
    pip 10.0.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)
  • pipを使用してvirtualenv
  • をインストール
    [~] → pip3 install virtualenv
    (installing)
    [~] → virtualenv --version
    16.0.0

    1.プロジェクトの作成


    |Django REST Frameworkのインストール

    (devenv)
    → pip install djangorestframework

    | settings.pyのINSTALLED APPSにrest frameworkを追加

  • プロジェクトの作成時に作成されたapiアプリケーションも
  • を追加しました.
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'rest_framework',
        'api',
    ]

    |モデルの作成

  • は、実施例
  • に用いる以前に使用したPostモデルを導入する.
    # api/models.py
    from django.db import models
    from django.contrib.auth.models import User
    class Post(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        title = models.CharField(max_length=144)
        subtitle = models.CharField(max_length=144, blank=True)
        content = models.TextField()
        created_at = models.DateTimeField(auto_now_add=True)
        def __str__(self):
            return '[{}] {}'.format(self.user.username, self.title)

    |シリアル化の作成


    既存のDjangoを用いたWeb開発では、Django ORMのQuerySetがDjangoテンプレートに渡され、HTMLとしてレンダリングされ、応答として送信される.ただし、RESTful APIではJSONにデータを送信する必要があるため、HTMLとして表示されるDjango templateは使用できません.
    したがって,QuerySetをネストされたJSONにマッピングする必要があり,これはSerializerによって完了する.

    Serializerの作成
  • Django RESTフレームワークを使用して提供されるModelSerializer
  • apiでシーケンス化器を使用します.py作成
  • # api/serializers.py
    from rest_framework import serializers
    from .models import Post
    from django.contrib.auth.models import User
    
    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('id', 'username', 'email')
    
    class PostSerializer(serializers.ModelSerializer):
        user = UserSerializer(read_only=True)
        class Meta:
            model = Post
            fields = (
                'id',
                'title',
                'subtitle',
                'content',
                'created_at',
            )
            read_only_fields = ('created_at',)

    |Viewの作成

  • ビューの役割
  • QuerySetを制御してデータを操作し、シリアルにより
  • をマッピングする.
  • は、CBVを使用して複数のビューを一度に作成するのではなく、Viewを使用してモデルを制御するCRUDを実装するビューを使用します.
    # api/views.py
    from rest_framework import viewsets
    from .serializers import PostSerializer
    from .models import Post
    from rest_framework import permissions
    
    class PostView(viewsets.ModelViewSet):
        queryset = Post.objects.all()
        serializer_class = PostSerializer
        permission_classes = (permissions.IsAuthenticated,)
        def perform_create(self, serializer):
            serializer.save(user=self.request.user)
    マッピング
  • URL
  • CRUDは大きく2つのURLパターンに分かれており,それぞれマッピングする必要がある.
  • # api/urls.py
    from django.urls import path, include
    from rest_framework.urlpatterns import format_suffix_patterns
    from .views import PostView
    post_list = PostView.as_view({
        'post': 'create',
        'get': 'list'
    })
    post_detail = PostView.as_view({
        'get': 'retrieve',
        'put': 'update',
        'patch': 'partial_update',
        'delete': 'destroy'
    })
    urlpatterns = format_suffix_patterns([
        path('auth/', include('rest_framework.urls', namespace='rest_framework')),
        path('posts/', post_list, name='post_list'),
        path('posts/<int:pk>/', post_detail, name='post_detail'),
    ])
  • はルートURL
  • に再マッピングする.
    # tutorial/urls.py
    from django.contrib import admin
    from django.urls import path, include
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('api/', include('api.urls')),
    ]

    |移行作成後に実行

    (devenv)
    → python manage.py makemigrations
    (devenv)
    → python manage.py migrate
    (devenv)
    → python manage.py createsuperuser
    (devenv)
    → python manage.py runserver

    |実行

    localhost:8000/api/posts/1/