1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【DRF(Django REST framework)】serializerのフィールドにmany=True指定時のrequired=Trueのバリデーションが想定と異なる

Last updated at Posted at 2021-07-30

環境

  • djangorestframework:2.4.0

問題のコード

  • 下記のようなシリアライザーを定義した
  • デフォルトでrequired=Trueのはずなので、tagをNULLで渡したときにバリデーションエラーになると考えた
class MediaSerializer(serializers.Serializer):
    tag = TagSerializer(many=True)
  • こんな感じのJSON
{
  "tag": null
}
  • しかし、結果はバリデーションエラーにならず処理が進んでしまった
  • required=Trueを定義しても結果は同じ
  • 動作検証をしたところ、バリデーションエラーになるのはtagキーがない場合のみ
パターン バリデーション
tagキーがない NG(バリデーションエラー)
tagがNULL OK
tagが空データ OK
  • DRF公式サイトを読んでも、それらしき記事は見つからず
  • 代わりにstag overflowにこんな記事があった

対策

  • tagのバリデーション関数を用意して、NULL or 空データをチェックする
  • DRFのバージョンが古いから発生するのかな。。。
class MediaSerializer(serializers.Serializer):
    tag = TagSerializer(many=True)

    def validate_tag(self, attrs, source):
        if not attrs.get(source):
            raise serializers.ValidationError("NULL or 空データだよ")
        return attrs
1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?