目的
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のモデルもしっかり表示することができている。