Django REST frameworkでAPIを作る
色々ドタバタして前回からだいぶ空きましたが、 DRFを用意したので責任とって使っていきたいと思います。
何がしたいの?
DRFを使ってみましょう。
以前にUserモデルを作ってcreate/list
とかupdate/delete
を実装して遊びました。
それをDRFでやってみたいと思います👍
前提
では 作っていきましょう👻
はいプロジェクトとかモデルを作っていきますがこれは以前の記事を参考にしてください!
ダイジェストで行きます!
APIを使うための準備をする
プロジェクトのスケルトンを作る。
$ python manage.py startapp hello_drf
# `django-my-template`を使用の方は↓
$ docker-compose run --rm web python manage.py startapp hello_drf
下記使わないので削除
- ./hello_drf/tests.py
- ./hello_drf/admin.py
モデルを作る
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
class User(models.Model):
name = models.CharField(verbose_name="名前", max_length=200)
age = models.PositiveSmallIntegerField(
verbose_name="年齢",
validators=[MinValueValidator(0), MaxValueValidator(200)],
)
モデルを有効化する
... # 省略
INSTALLED_APPS = [
"hello_drf.apps.HelloDrfConfig", # 追加
# ... 略
]
... # 省略
からのマイグレーション
$ python manage.py makemigrations
$ python manage.py migrate
# django-my-templateを使用の方は↓
$ make makemigrations
$ make migrate
アプリのエンドポイントがまだ無いですが、一旦プロジェクトに登録します
from django.urls import include, path
urlpatterns = [
path("hello/", include("hello_drf.urls)),
]
はい、ここまで。
このプロジェクトに足りてないのview
とエンドポイントなのでこの2つをDRFを使って実装するとどうなるのかな?って話ですね🤔
※ ここまでの一連の定番流れは、もう書かなくてもいいですかね😅
viewを実装
一旦途中まで実装します。今回はModelViewSetを使って実装します。
※ drfのAPIの実装方法は複数ある(笑)詳細はこちら
from rest_framework.viewsets import ModelViewSet
from .models import User
class UserViewSet(ModelViewSet):
queryset = User.objects.all()
つぎに〜
serializerを作成しますー😆
シ・リ・ア・ラ・イ・ザ👍
新しく出てきた単語ですね!
ぶっちゃけるとUser
モデルをいい感じのdict/json
に吐く、吐き方の定義みたいなものです。
以前の記事の↓にと動作自体はかなり近いものがあります。
# create_user関数のレスポンス部分
# この部分(↓)が近い。userモデルを力技で`Dict`型に変更してる
return JsonResponse({"id": user.id, "name": user.name, "age": user.age})
では実装します。シリアライザ―にどんな定義が書いてるのか、
この真上のコードと真下のコードを比べると何となく分かると思います🤔
from rest_framework.serializers import ModelSerializer
from .models import User
class UserSerializer(ModelSerializer):
class Meta:
model = User
fields = ("id", "name", "age")
次にserializerをviewに追加します
from rest_framework.viewsets import ModelViewSet
from .models import User
from .serializers import UserSerializer
class UserViewSet(ModelViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
最後にエンドポイントを設定します
from rest_framework.routers import SimpleRouter
from .views import UserViewSet
router = SimpleRouter()
router.register("users", UserViewSet, basename="user")
urlpatterns = router.urls
完成⭐
サーバーを機動します!
# `django-my-template`を使用の方は↓
make docker-up
動作確認はこの辺(↓)を叩くと色々遊べると思います。
http://localhost:8000/hello/users/
DRFはテスト用のGUIも提供してくれるのでありがたいですね👍
次郎くん3歳
をGUIからたくさんPOST
した後のリスト
http://localhost:8000/hello/users/1/
id=1
のUserの詳細情報をGET
とかPUT
で上書きとか、DELELE
で削除とか色々GUI上からできます😆
ちなみにcli上からやる場合は
# 一覧取得
$ curl http://localhost:8000/hello/users/
> [{"id":2,"name":"ziro","age":3},{"id":3,"name":"ziro","age":3},{"id":4,"name":"ziro","age":3},{"id":5,"name":"ziro","age":3},{"id":6,"name":"ziro","age":3},{"id":7,"name":"ziro","age":3}]
# ユーザー個別の詳細情報
$ curl http://localhost:8000/hello/users/2/
> {"id":2,"name":"ziro","age":3}
# 新規ユーザー作成
$ curl -X POST -d name=ziro -d age=10 http://localhost:8000/hello/users/
> {"id":8,"name":"ziro","age":10}
# ユーザー情報更新
$ curl -X PUT -d name=ZIRO -d age=100 http://localhost:8000/hello/users/2/
> {"id":2,"name":"ZIRO","age":100}
# ユーザーの削除
$ curl -X DELETE http://localhost:8000/hello/users/2/
$ curl -X DELETE http://localhost:8000/hello/users/3/
$ curl -X DELETE http://localhost:8000/hello/users/4/
$ curl -X DELETE http://localhost:8000/hello/users/5/
$ curl -X DELETE http://localhost:8000/hello/users/6/
$ curl -X DELETE http://localhost:8000/hello/users/7/
$ curl http://localhost:8000/hello/users/
> [{"id":8,"name":"ziro","age":10}]
うん、面白い😉
まとめ
今回はDRFを使うと素のDjangoと比べて、かなり簡単にAPIが実装できることを体感するために、DRFを使い具体的なREST APIを使って遊んでみました😊
今回のリポジトリはこちら
https://github.com/sisi100/django-my-template/tree/post/hello_drf