DRF - 如何在序列化器create()上处理异常?

时间:2017-09-29 16:06:29

标签: django django-rest-framework

我正在使用友情Django模块和Django Rest Framework。在创建API时,Serializer的create()可能会引发一些异常 - AlreadyFriendsError,DoesNotExist或AssertionError。现在发生异常时,返回对象无效(无),并且我得到一个带有断言错误的回溯: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

我该如何处理这个案子?当对象无效时我应该返回什么?

1 个答案:

答案 0 :(得分:4)

如果您不想建立自定义错误(此处为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")

这应该可以解决您的要求。

代码的一些额外的Tipps:

  1. 结帐验证和自定义drf验证器http://www.django-rest-framework.org/api-guide/validators/他们可以帮助您解决类似问题并帮助您将业务逻辑与序列化工具分开
  2. 除了点击3个不同的例外,为了有一个更容易使用的API,您应该使用单独的错误消息进行响应,以便为客户端提供更多上下文