MawaLog

一日一日、楽しく生きる。技術と音楽が好き。

DRF で try: と raise Validationerror を組み合わせて失敗した話

Django

Django

症状

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