📖
Django REST framework JSON:API(DJA)に独自のモデルを追加する
概要
以下の記事で、Django REST framework JSON:API(DJA)の基本的な操作方法を確認しました。
本記事では、DJAに独自のモデルを追加してみます。
参考
以下の記事を参考に、UserInfo
モデルを追加してみます。
手順
モデルを定義
以下を追記します。
/django-rest-framework-json-api/example/models.py
# ユーザ情報を格納する
class UserInfo(BaseModel):
user_name = models.CharField(verbose_name='ユーザ名',max_length=32) # ユーザ名
birth_day = models.DateField(verbose_name='生年月日') # 生年月日
age = models.PositiveSmallIntegerField(verbose_name='年齢',null=True,unique=False) # 年齢
created_at = models.DateTimeField(verbose_name='作成日時',auto_now_add=True)
データベースを構築
以下を実行します。
% django-admin makemigrations --settings=example.settings
Migrations for 'example':
example/migrations/0013_userinfo.py
- Create model UserInfo
% django-admin migrate --settings=example.settings
Operations to perform:
Apply all migrations: auth, contenttypes, example, sessions, sites
Running migrations:
Applying example.0013_userinfo... OK
参考までに、以下のようなファイルが作成されます。
/django-rest-framework-json-api/example/migrations/0013_userinfo.py
# Generated by Django 4.1.8 on 2023-06-04 17:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("example", "0012_author_full_name"),
]
operations = [
migrations.CreateModel(
name="UserInfo",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("modified_at", models.DateTimeField(auto_now=True)),
("user_name", models.CharField(max_length=32, verbose_name="ユーザ名")),
("birth_day", models.DateField(verbose_name="生年月日")),
("age", models.PositiveSmallIntegerField(null=True, verbose_name="年齢")),
(
"created_at",
models.DateTimeField(auto_now_add=True, verbose_name="作成日時"),
),
],
options={
"abstract": False,
},
),
]
コンポーネントの作成
Serializer
以下を追記します。
/django-rest-framework-json-api/example/serializers.py
...
from example.models import (
...,
UserInfo
)
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
fields = ('id','user_name', 'birth_day','age','created_at')
class UserInfoDRFSerializer(drf_serilazers.ModelSerializer):
"""
DRF default serializer to test default DRF functionalities
"""
class Meta:
model = UserInfo
fields = ('id','user_name', 'birth_day','age','created_at')
...
ViewSets
Viewクラスを定義します。
/django-rest-framework-json-api/example/views.py
...
from example.models import (
...,
UserInfo
)
from example.serializers import (
...,
UserInfoSerializer
)
...
class UserInfoViewset(ModelViewSet):
queryset = UserInfo.objects.all()
serializer_class = UserInfoSerializer
def get_object(self):
entry_pk = self.kwargs.get("entry_pk", None)
if entry_pk is not None:
return Entry.objects.get(id=entry_pk).blog
return super().get_object()
...
Router
以下を追記します。
/django-rest-framework-json-api/example/urls.py
...
from example.views import (
AuthorRelationshipView,
...
UserInfoViewset
)
router = routers.DefaultRouter(trailing_slash=False)
router.register(r"blogs", BlogViewSet)
...
router.register(r"user-info", UserInfoViewset)
結果
http://localhost:8000/にアクセスすると、user-info
が作成されました。
http://localhost:8000/user-infoにおいて、一覧も取得できました。
まとめ
DJAの利用にあたり、参考になりましたら幸いです。
Discussion