Django REST Frameworkの動作確認 Serializerを定義

前回の記事の続きです。

programming-gogogogo.hatenablog.com

前回でviewに関数を定義してレスポンスを返すことはできたので、次はSerializerを定義してDBの値をJSONで返したいと思います。

そういえばまだLinterを入れてなかったのでFlake8をインストールしました。

また、drfproject/drfproject/settings.pyのINSTALLED_APPSにrest_frameworkを追加します。

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "blog",
    "rest_framework", # 追加
]

drfprpject/blog/serializers.pyを作成し、以下の内容にします。

from rest_framework import serializers
from .models import User


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

これでUserテーブルのデータをJSONで返すSerializerができていると思います。 Serializerの書き方は公式ドキュメントの以下のページを参考にしました。
https://www.django-rest-framework.org/api-guide/serializers/#specifying-which-fields-to-include

対話型シェルで以下のように動作確認することができました。

>>> from blog.serializers import UserSerializer
>>> serializer = UserSerializer()
>>> print(serializer)
UserSerializer():
    id = IntegerField(label='ID', read_only=True)
    name = CharField(max_length=100)
    age = IntegerField()

次に関数を書き直してみます。

drfproject/blog/views.py

from rest_framework import viewsets
from .serializers import UserSerializer
from .models import User
from django.http import JsonResponse


def users_list(request):
    users = User.objects.all()
    serializer = UserSerializer(users, many=True)

    return JsonResponse(serializer.data, safe=False)

blogディレクトリにurls.pyを作成し、ルーティングを定義します。

touch drfproject/blog/urls.py
from django.urls import path
from blog import views

urlpatterns = [
    path('blog/', views.users_list)
]

メインのdrfproject/drfproject/urls.pyを編集します。

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path("admin/", admin.site.urls),
    path('', include('blog.urls'))
]

再度ローカルサーバーを起動し、APIレスポンスを確認します。

python manage.py runserver

curl http://localhost:8000/blog/
[{"id": 1, "name": "testuser", "age": 10}]