/ #Django 

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

Author

Sisii

AWSが好きなフリーランスのエンジニア。主にAWSを使ったバックエンドの開発をしています😊最近Frontも始めました