Django REPOS Cadre comment spécifier le code d'erreur lors de la récolte d'erreur de validation dans sérialiseur

J'ai une API d'extrémité qui permettent aux utilisateurs de créer un compte. Je voudrais revenir HTTP 409 au lieu de 400 pour un double nom d'utilisateur.

Voici mon sérialiseur:

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'

Lorsque l'erreur est déclenchée, la réponse est: {"detail":"Duplicate Username"}. J'ai réalisé que si je sous-classe APIException, la clé detail est utilisé à la place de username.

Je veux avoir cette réponse plutôt {"username":"Duplicate Username"}

ou je tiens à spécifier un code d'état, en relançant un 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

Mais cela ne fonctionne pas comme ValidationError retourne seulement 400.

Est-il un autre moyen pour accomplir cette?

OriginalL'auteur Cheng | 2015-11-02