前回の記事↓
Djangoでjsonを扱うRESTfulなAPIを作る - Qiita
Django REST framework の追加
djangoのrest frameworkをインストールします
$ pip install djangorestframework
setting.py
内の INSTALLED_APPという項目にrest_frameworkを追加します
.....
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
+ 'rest_framework' #追加行
]
.....
シリアライザーの作成
シリアライズとは、複数の並列データを直列化して送信することを意味します
シリアライザーファイルをmyapp内に作成します
$ touch myapp/serializers.py
中身を編集します
from rest_framework import serializers
from myapp.models import Book, Author
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
apiの作成
$ touch myapp/apis.py
from rest_framework import viewsets, routers
from myapp.models import Book
from myapp.serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
router = routers.DefaultRouter()
router.register(r'books', BookViewSet)
urls.pyを以下のように編集することでapiのエンドポイントを記述します
from django.conf.urls import url,include
from django.contrib import admin
from myapp import apis
urlpatterns = [
url(r'^api/', include(apis.router.urls)),
]
プラウザで http://localhost:8000/api にアクセスします
apiのルートコンソール画面が表示されました
今度は http://localhost:8000/api/books にアクセスしてみましょう
Creating a ModelSerializer without either the 'fields' attribute or the 'exclude' attribute has been deprecated since 3.3.0, and is now disallowed. Add an explicit fields = '__all__' to the BookSerializer serializer.
というエラーが返されるはずです
これはrest_framework3.3.0以降でModelSerializerにfields属性やexclude属性を追加していないために発生します
Serializers - Django REST framework
You can also set the fields attribute to the special value '__all__' to indicate that all fields in the model should be used.
今回はfieldsを特に制限するつもりはないので、serializers.pyを以下のように編集します
from rest_framework import serializers
from myapp.models import Book, Author
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
+ fields='__all__' #追加行
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
+ fields='__all__' #追加行
http://localhost:8000/api/books に再アクセスしてみます
この画面が出れば成功です
コンソール画面からのPOST
curl
コマンドやクライアントサイドからPOSTできますが、このコンソール画面からも可能です
content:の欄にpostしたいデータを入力して右下のpostボタンを押します
3つ本を追加してみました
コンソール画面からのPUT
putしたいデータのid番号にアクセスします
今回はid2を編集したいのでアドレスは http://localhost:8000/api/books/2/ となります
postと同じようにフォームに入力します
変更できているか確認します http://localhost:8000/api/books/
無事(?)おじいさんが生まれました
コンソール画面からのDELETE
putのときと同じ画面の赤いボタンを押すと、特定のidのデータを削除することができます