2017-09-29 45 views
1

我在Django Rest Framework中使用友誼Django模塊。在創建API時,Serializer的create()可能會引發一些異常 - AlreadyFriendsError,DoesNotExist或AssertionError。現在,當發生異常時,返回對象無效(無),並且我得到一個Traceback,其中AssertionError:create()未返回對象實例DRF - 如何處理序列化程序create()中的異常?

從我的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) 

從我的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 

我應該如何真正處理這種情況?當對象無效時應該返回什麼?

回答

2

如果您不想建立自定義錯誤(這裏是DRF錯誤http://www.django-rest-framework.org/api-guide/exceptions/),我會選擇驗證錯誤。

您的錯誤告訴您您需要以某種對象進行響應,因爲如果您的嘗試失敗,則返回None

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

這應該可以解決您的需求。

爲您的代碼一些額外的竅門:

  1. 結賬驗證以及定製的DRF驗證器http://www.django-rest-framework.org/api-guide/validators/他們可以幫助你類似的情況,並幫助你的業務邏輯從串行
  2. 的,除了命中3個不同的異常分離,要有一個更易於使用的API,您應該使用單獨的錯誤消息進行響應,以便爲客戶端提供更多上下文