【问题标题】:DRF - How to handle exception on serializer create()?DRF - 如何处理序列化程序创建()上的异常?
【发布时间】:2017-09-29 16:06:28
【问题描述】:

我将友谊 Django 模块与 Django Rest Framework 一起使用。创建 API 时,Serializer 的 create() 可能会引发一些异常 - AlreadyFriendsError、DoesNotExist 或 AssertionError。现在,当发生异常时,返回对象无效(无),我得到一个带有 AssertionError:create() 没有返回对象实例的 Traceback。

来自我的 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

我应该如何处理这种情况?当对象无效时我应该返回什么?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    如果您不想建立自定义错误,我可能会选择验证错误(此处为 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 更易于使用,您应该使用单独的错误消息进行响应,以便为客户端提供更多上下文

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      相关资源
      最近更新 更多