ユーザーにアカウントを登録できるAPIエンドポイントがあります。重複したユーザー名に対して400ではなくHTTP 409を返したいと思います。エラーがトリガされるとDjango REST Frameworkシリアライザで検証エラーを発生させる際にエラーコードを指定する方法
from django.contrib.auth.models import User
from rest_framework.serializers import ModelSerializer
class UserSerializer(ModelSerializer):
username = CharField()
def validate_username(self, value):
if User.objects.filter(username=value).exists():
raise NameDuplicationError()
return value
class NameDuplicationError(APIException):
status_code = status.HTTP_409_CONFLICT
default_detail = u'Duplicate Username'
、応答は次のとおりです:{"detail":"Duplicate Username"}
は、ここに私のシリアライザです。 APIExceptionをサブクラス化すると、username
の代わりにdetail
というキーが使用されることに気付きました。
は、私が代わりに{"username":"Duplicate Username"}
この応答を持つようにしたいか、私はValidationErrorをを上げるステータスコードを指定したいと思います:
def validate_username(self, value):
if User.objects.filter(username=value).exists():
raise serializers.ValidationError('Duplicate Username',
status_code=status.HTTP_409_CONFLICT)
return value
をしかしValidationError
のみ400
これを達成する他の方法はありますか?
素晴らしいです。異なるビューの例外をカスタマイズしたい場合、この関数は非常に複雑になります。ビューの数が増えると、この関数も同様に増加します。私はスケーラブルな解決策があるのだろうかと思います。 – Cheng
「詳細」を上書きすることを意味していますか? –
私がオーバーライドしたい3つの例外がある場合は、 'custom_exception_handler'にif..elif..elif構造体があります。私がカスタマイズしたい例外が増えるほど、このメソッドで書く必要が増えます。また、どのビューのどのHTTPアクションがブランチであるかを覚えておく必要があります。これは本物の問題となる可能性があります。 – Cheng