DRF で try: と raise Validationerror を組み合わせて失敗した話
- アーティスト: O.S.T.
- 出版社/メーカー: Universal
- 発売日: 2017/04/07
- メディア: CD
- この商品を含むブログを見る
症状
#api.serializer class HogeSerializer(ModelSerializer): class Meta: model = Hoge fields = [ 'id', 'title', ] def validate(self, data): #titleがかぶったらエラーを出すバリデーション関数をつくる try: Hoge.objects.get(title=data.get('title')) #titleでオブジェクトが見つかったら(エラーがなかったら) raise ValidationError("title is already registered") (エラーを出すよ) except: print("Validate is True")
という風につくると、raise ValidationError
が正しく出力されても、それ自体がエラーなので、try:以下はエラー処理されてprint("Validate is True")
を出力してしまうのでこれはやったらハマります。
解決策
うまく行ったパターン 自分で目印になる内部変数をつくって運用するとうまくいきます。以下の要領です。
#api.serializer class HogeSerializer(ModelSerializer): class Meta: model = Hoge fields = [ 'id', 'title', ] def validate(self, data): #titleがかぶったらエラーを出すバリデーション関数をつくる try: Hoge.objects.get(title=data.get('title')) #titleでオブジェクトが見つかったら(エラーがなかったら) sign = 0(titleかぶりありならsignは0とする) except: sign = 1(titleかぶりなしならsignは0とする) if sign == 0: raise ValidationError("title is already registered") (エラーを出すよ)
こうすればtryとraise ValidationErrorが分離できるのでちゃんと動きます^^