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が分離できるのでちゃんと動きます^^