0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Django REST Framework】idをリクエストボディのパラメータに含めて送りたい

Posted at

はじめに

`"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が欠落してしまう

解決

原因:

シリアライザではidModelSerializerでは受け取れない。

対応:

シリアライザの定義を以下に変更する。

serializers.py
- class ArtistForSongRequestSerializer(serializers.ModelSerializer):
-    class Meta:
-        model = Artist
-        fields = ["id"]

+ class ArtistForSongRequestSerializer(serializers.Serializer):
+   id = serializers.IntegerField()
  • ModelSerializerからSerializerに変更
  • idserializers.IntegerFieldで定義

この修正により出力は以下のようになる

OrderedDict([('artist', OrderedDict([('id', 1)])), ('title', '言って')])

IDが含まれました!

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?