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


環境

  • 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