matobaの学んだこと

とあるPythonエンジニアのブログ。ソフトウェア開発、執筆活動、ライフログ。

忙しい人のためのちょっとだけdjango-rest-framework

くろのて勉強会に参加してdjango-rest-frameworkを学びました。(まだ第一回なので、views周りしか学んでません) とりあえず学んだこと、自分で調べていたことを備忘録として書いておきます。

走り書きで、あまり丁寧に説明はしてません。

cronote.connpass.com

インストール

  • djangoプロジェクトがある前提です。 myproject って名前で作っておきます。
  • pip install djangorestframeworkしましょう。(venvは適宜有効化します)
  • INSTALLED_APPSrest_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に追加してくれる。

とりあえず、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/ アクセスしてみるとデモ画面が見れました。

f:id:mtb_beta:20190130000149p:plain

api/myapp/mymodel/ 配下に、今回作ったMyModel用のviewsetsのデモ画面があります。

f:id:mtb_beta:20190130000730p:plain

POSTできるので二つほど登録してみました。

その後、 api/myapp/mymodel/ にアクセスすると、一覧が見れます。

f:id:mtb_beta:20190130000249p:plain

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指定でアクセスすると、一つのレコードにアクセスできます。

f:id:mtb_beta:20190130000319p:plain

HTTPのDELETEを /api/myapp/mymodel/1/ に投げると消せます。

$ curl -X DELETE http://127.0.0.1:8000/api/myapp/mymodel/1/

この辺りを見るとModelViewSetには、他にもUpdateとかURLがありそうなのがわかります。

www.django-rest-framework.org

URLはまだよくわかっていません。

終わり

疲れて来たので、この辺で終わります。とりあえず雰囲気でdjango-rest-frameworkを触って見ました。

次回以降も参加できたら参加して、学んでいきたいと思います。 ではではー