📖

Django REST framework JSON:API(DJA)に独自のモデルを追加する

2023/06/05に公開

概要

以下の記事で、Django REST framework JSON:API(DJA)の基本的な操作方法を確認しました。

https://zenn.dev/nakamura196/articles/4f65c3a46ab468

本記事では、DJAに独自のモデルを追加してみます。

参考

以下の記事を参考に、UserInfoモデルを追加してみます。

https://tech-blog.rakus.co.jp/entry/20220329/python

手順

モデルを定義

以下を追記します。

/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