LoginSignup
4
0

More than 1 year has passed since last update.

【必見】django_restframworkでリレーションモデルをJSON形式で展開する方法

Posted at

目的

DjangoRestframeworkでAPIを作成していて、

{
        "id": "9510f7c1-a364-4e44-96ae-2fdd7fbc957d",
        "gender": "M",
        "username": "Shun",
        "age": 25,
        "introduction": "よろしく",
        "job":1
}

このようなJSONをResponseとして返していたが、
このコードではjob: 1となっていてかなり扱いづらいJSONとなっているためなんとかしなければならないと思った。

解決方法

親モデルの利用するシリアライザの中に

外部キー名 = 外部キーのテーブルのシリアライザ名()

と記述するだけで外部キーのテーブルを展開できた。

具体例

django_restframeworkでModelViewSetを利用している。
Membersモデルの中にjobの外部キーがあり、Jobsモデルを参照している状態だ。
これに外部キー名 = 外部キーのテーブルのシリアライザ名()を記述して扱いやすいJSONとする。

serializer.py
class JobSerializer(serializers.ModelSerializer):
    class Meta:
        # 対象のモデルを指定
        model = Jobs
        # 対象のフィールドを指定
        # created_atは対象外
        fields = ('id', 'average_salary', 'job_name','is_holiday_on_weekend','paid_holiday_count')


class MemberSerializer(serializers.ModelSerializer):
    # jobフィールドにjobのモデルを展開する
    job = JobSerializer()

    class Meta:
        # 対象のモデルを指定
        model = Members
        # 対象のフィールドを指定
        # created_atは対象外
        fields = ('id', 'gender', 'username','age','introduction', 'job')

注意!!!!

class Metaの下にmodelやfieldsは記述するが、この時のjobフィールドを記述するのはclass Metaの下ではない。
ここでかなり時間を費やしたバカがいるため気をつけること。

Postmanを使ってgetメソッドでAPIを叩いてみる。

{
        "id": "f2e603b7-ae21-42c7-bada-a9eb93ad8a7a",
        "gender": "M",
        "username": "Yuto",
        "age": 24,
        "introduction": "Sup. I'm Yuto. All I can do for u is make you laugh and happy 24/7. It's fair enough, isn't it??",
        "job": {
            "id": 1,
            "average_salary": 1000000,
            "job_name": "marketing",
            "is_holiday_on_weekend": true,
            "paid_holiday_count": 100
        }
    }

最初のjsonとは違ってjobのモデルもしっかり表示することができている。

参考文献

Django REST Frameworkを使って爆速でAPIを実装する
[DRF]結合テーブルの取得【N+1問題】

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0