はじめに
`"ID"`をパラメータとして送りたかったが、なぜか欠落してしまったので備忘録として残しておきます。
問題
以下のようなjsonをリクエストで送信する場合
※こんなリクエストや以下の定義は送らないと思いますが、ご容赦を。。。
{
"title": "言って",
"artist":{
"id": 1
}
}
シリアライザ定義
serializers.py
class ArtistForSongRequestSerializer(serializers.ModelSerializer):
class Meta:
model = Artist
fields = ["id"]
class SongRegistRequestSerializers(serializers.Serializer):
artist = ArtistForSongRequestSerializer()
title = serializers.CharField()
エンドポイント定義
@extend_schema(
request=SongRegistRequestSerializers,
tags=["song"],
)
def post(self: Self, request: Request, *args: Any, **kwargs: Any) -> Response:
"""songs Regist API"""
serializer = SongRegistRequestSerializers(data=request.data)
serializer.is_valid(raise_exception=True)
print(serializer.validated_data)
# 省略
出力結果は以下の通りとなる。
OrderedDict([('artist', OrderedDict()), ('title', '言って')])
idが欠落してしまう
解決
原因:
シリアライザではid
をModelSerializer
では受け取れない。
対応:
シリアライザの定義を以下に変更する。
serializers.py
- class ArtistForSongRequestSerializer(serializers.ModelSerializer):
- class Meta:
- model = Artist
- fields = ["id"]
+ class ArtistForSongRequestSerializer(serializers.Serializer):
+ id = serializers.IntegerField()
-
ModelSerializer
からSerializer
に変更 -
id
をserializers.IntegerField
で定義
この修正により出力は以下のようになる
OrderedDict([('artist', OrderedDict([('id', 1)])), ('title', '言って')])
IDが含まれました!