2017-09-29 4 views
1

J'utilise le module d'amitié Django avec Django Rest Framework. Lors de la création d'une API, la fonction create() de Serializer peut générer certaines exceptions - AlreadyFriendsError, DoesNotExist ou AssertionError. Maintenant, lorsqu'une exception se produit, l'objet de retour n'est pas valide (None) et j'obtiens un Traceback avec le AssertionError: create() n'a pas renvoyé une instance d'objet.DRF - Comment gérer les exceptions sur le sérialiseur create()?

De mon API views.py

class FriendManageAPIView(CreateAPIView): 
    permission_classes = (permissions.IsAuthenticated,) 
    serializer_class = FriendManageSerializer 

    def post(self, request, *args, **kwargs): 
     if request.data['action'] == 'add_friend': 
      return self.create(request, *args, **kwargs) 

De mon API serializers.py

class FriendManageSerializer(serializers.ModelSerializer): 
    to_user = serializers.CharField(max_length=150) 

    def create(self, validated_data): 
     friendship_ret = None 
     try: 
      request = self.context.get("request") 
      if request and hasattr(request, "user"): 
       user = request.user 

      user_model = get_user_model() 
      to_user = user_model.objects.get(username=request.data['to_user']) 
      friendship_ret = Friend.objects.create(
       from_user=user, # The sender 
       to_user=to_user, # The recipient 
      ) 
      friendship_ret.save() 
     except (AlreadyFriendsError, user_model.DoesNotExist, AssertionError): 
      print("EXCEPTION FriendManageSerializer.create()") 

     return friendship_ret 

Comment dois-je vraiment gérer ce cas? Que devrais-je retourner quand l'objet n'est pas valide?

Répondre

2

Je choisirais une erreur de validation si vous ne voulez pas établir d'erreurs personnalisées (ici les erreurs DRF http://www.django-rest-framework.org/api-guide/exceptions/).

Votre erreur vous indique que vous devez répondre avec le type d'objet car si votre tentative échoue, None est renvoyé.

except (AlreadyFriendsError, user_model.DoesNotExist, AssertionError): 
    raise serializers.ValidationError("human readable error message here") 

Cela devrait résoudre votre besoin.

Certains Tipps supplémentaires pour votre code:

  1. validation de votre commande et DRF personnalisé validateurs http://www.django-rest-framework.org/api-guide/validators/ ils peuvent vous aider à des situations similaires et aider à séparer votre logique métier de votre serializers
  2. l'exception coups 3 différentes exceptions, pour avoir une API plus facile à utiliser, vous devez répondre avec des messages d'erreur séparés pour avoir plus de contexte pour le client