くろのて勉強会に参加してdjango-rest-frameworkを学びました。(まだ第一回なので、views周りしか学んでません) とりあえず学んだこと、自分で調べていたことを備忘録として書いておきます。
走り書きで、あまり丁寧に説明はしてません。
インストール
- djangoプロジェクトがある前提です。
myproject
って名前で作っておきます。 pip install djangorestframework
しましょう。(venvは適宜有効化します)INSTALLED_APPS
にrest_framework
を追加しましょう。
ちなみに現時点では Django-2.1.5
djangorestframework-3.9.1
です。
modelsの準備
- REST APIで呼び出すmodelsが必要です。
- まず、djangoアプリを追加しておきます。今回は
myapp
にします。 - modelsを追加しておきます。 今回は、
myapp.models.MyModel
にします。
from django.db import models class MyModel(models.Model): name = models.CharField(max_length=20) description = models.TextField(default='', blank=True)
makemigrations
&migrate
を実行しておきます。- modelsは、rest_framework特有の何かを入れる必要はありません。(多分)
viewを用意
- modelsにアクセスするAPIのViewをrest_frameworkで作ります。
- 次の4種類のViewがあるようです。全部、RequestsとResponseがrest_frameworkで加工されます。
- function view
- djangoのfunction viewみたいなもの。rest_frameworkのデコレータをつけResponseはrest_frameworkのクラスを使う。
- class based view
- djangoのclass based viewみたいなもの。getとかpostメソッドを作れる。Requestsがrest_frameworkで加工され、Responseはrest_frameworkのクラスを使う。
- Generic View
- djangoのGenericViewみたいなもの。CreateAPIViewとかListAPIViewとかある。
- ViewSet
- GenericViewのセット。djangoのurls.pyあたりでrest_frameworkのRouterにviewsetsを登録して、そのRouterをurlsに追加しておくと、各種のGenericViewに対応したURLとViewを生成して自動的にurlpatternsに追加してくれる。
- function view
とりあえず、viewsetを登録してみよう。
myapp/views.py
from rest_framework import viewsets from myapp.models import MyModel from myapp.serializer import MyModelSerializer class MyModelViewSet(viewsets.ModelViewSet): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
今回は、一番標準っぽいviewsetsのModelViewSetを使います。querysetは察してください。僕も雰囲気で見てます。
serializer_classは、シリアライズするクラスです。入力と出力のフォーマッターみたいなものかな?djangoでいうModelFormみたいなやつです。たぶん。今回は以下を用意しました。
myapp/serializer.py
from rest_framework import serializers from myapp.models import MyModel class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = ('name', 'description')
urlsを書く
myproject/urls.py
に追加するアプリのurlsを追加。
myproject/urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('api/myapp/', include('myapp.urls')), ]
myapp/urls.py
で作ったviewsetを追加したRouterを追加して、urlpatternsに登録。Routerにも意味があるんだろうけど、今のところよくわかっていません。
myapp/urls.py
from django.urls import path, include from rest_framework import routers from myapp import views router = routers.DefaultRouter() router.register('mymodel', views.MyModelViewSet) urlpatterns = [ path('', include(router.urls)), ]
確認
これで、各種もろもろが登録された様子です。確認してみましょう。
python manage.py runserver
で起動しておきます。
api/myapp/
アクセスしてみるとデモ画面が見れました。
api/myapp/mymodel/
配下に、今回作ったMyModel用のviewsetsのデモ画面があります。
POSTできるので二つほど登録してみました。
その後、 api/myapp/mymodel/
にアクセスすると、一覧が見れます。
HTTPでcontent-typeを指定してアクセスすると、jsonが返って来ます。
$ curl -H 'Content-Type:application/json' http://127.0.0.1:8000/api/myapp/mymodel/ [{"name":"mtb_beta","description":"テストテストテスト"},{"name":"mtb_beta2","description":"テストテストテストテストテストテストテストテストテストテストテストテスト"}]
ID指定でアクセスすると、一つのレコードにアクセスできます。
HTTPのDELETEを /api/myapp/mymodel/1/
に投げると消せます。
$ curl -X DELETE http://127.0.0.1:8000/api/myapp/mymodel/1/
この辺りを見るとModelViewSetには、他にもUpdateとかURLがありそうなのがわかります。
URLはまだよくわかっていません。
終わり
疲れて来たので、この辺で終わります。とりあえず雰囲気でdjango-rest-frameworkを触って見ました。
次回以降も参加できたら参加して、学んでいきたいと思います。 ではではー