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
Vous devez vous connecter pour publier un commentaire.
Vous pouvez soulever des exceptions comme:
vous pouvez l'utiliser dans vos sérialiseur comme:
ou
OriginalL'auteur Anush Devendra
Utiliser django-repos-cadre personnalisé gestionnaire d'exception http://www.django-rest-framework.org/api-guide/exceptions/
vous voulez remplacer "détail"?
Je veux dire, si il y a 3 exceptions que je veux remplacer, alors je vais avoir un si..elif..elif structure en
custom_exception_handler
. Le plus de l'exception que je veux personnaliser, le plus fi je dois écrire dans cette méthode. Aussi, j'ai besoin de vous souvenir si la direction générale est responsable de vue qui est qui HTTP d'action. Ce peut être un vrai problème sur la ligne.OriginalL'auteur mntl_