環境
- macOS Catalina 10.15.4
- Python 3.8.1
- Django 2.2
- djangorestframework 3.11.0
Django REST framework のインストールは以下のコマンドでできます。
pip install djangorestframework
早速始めていきましょう!!
事前準備
Djangoのプロジェクトを作ります。
django-admin startproject tutorial
cd tutorial
次にアプリです。今回はブログっぽいアプリを作るという感じで話を進めていきます。
django-admin startapp blog
今こんなフォルダ構成です。(余計なのは消してます)
.
├── blog
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── tutorial
├── settings.py
├── urls.py
└── wsgi.py
tutorial/settings.pyにアプリを追加します。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # 追加
'blog' # 追加
]
modelの作成
blog/models.py
from django.db import models
class Blog(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
今回modelはこのように作成しました。ブログの記事のタイトル、内容、作成日時を持ちます。modelがかけたらmigrateします。
python manage.py makemigrations
python manage.py migrate
serializerの作成
blog内に新たにserializers.pyファイルを作成します。
from rest_framework import serializers
from .models import Blog
class BlogSerializer(serializers.ModelSerializer):
class Meta:
model = Blog
fields = ['id', 'title', 'content']
シリアライズするというのは、モデルをjson形式にして返す。というような意味合いだと認識しています。ModelSirializerを継承することで、簡単にモデルをシリアライズできるクラスを作成できます。ここのfieldsに指定した値をjson形式にして返してくれます。
ついでにadmin.pyを編集して管理画面でBlogモデルをいじれるようにしておきます。
from django.contrib import admin
from .models import Blog
admin.site.register(Blog)
runserverをしてテストデータを5つほど追加します。

viewの作成
次にviewの作成です。blog/views.pyを次のようにします。
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Blog
from .serializers import BlogSerializer
@api_view(['GET', 'POST'])
def blog_list(request, format=None):
if request.method == 'GET':
blog = Blog.objects.all()
serializer = BlogSerializer(blog, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = BlogSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET', 'PUT', 'DELETE'])
def blog_detail(request, pk, format=None):
try:
blog = Blog.objects.get(pk=pk)
except Blog.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = BlogSerializer(blog)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = BlogSerializer(blog, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
blog.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
今回は関数ベースビューを使いました。クラスベースビューを使うともっと簡単に実装できるのですが、関数ベースビューの方が何をしているのかわかりやすいので採用しました。
urlの作成
次にurlとviewを紐付けします。
tutorial/urls.pyを次のように書き換えます。
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
admin以外のURLにリクエストした場合はblogアプリ内のurlにviewを探しにいきます。
blogアプリ内に新しくurls.pyを作成し、次のように書きます。
from django.urls import path
from .views import blog_list, blog_detail
urlpatterns = [
path('blog/', blog_list),
path('blog/<int:pk>/', blog_detail),
]
動作確認
ブラウザ編
runserverをしてlocalhost:8000/blogにリクエストすると以下のような画面になるはずです。

またlocalhost:8000/api/blog/1のようなurlにリクエストすると、それぞれのデータが返ってきます。

ターミナル編
runserverしているのと別のターミナルを用意してこちらからurlにリクエストを投げて動作確認することもできます。以下のコマンドを実行してください。
pip install httpie
次にurlにリクエストしてみます。するとjsonでレスポンスが返ってきます。
http http://127.0.0.1:8000/blog/
また以下のコマンドでレスポンスの形を変えることができます。
http http://127.0.0.1:8000/blog.json
http http://127.0.0.1:8000/blog.api
さらにPOSTでリクエストをすることで、データを新しく追加することもできます。
http --form POST http://127.0.0.1:8000/blog/ title="test6" content="post from terminal"
参考

続きはこちら
コメント