gpt4 book ai didi

django - DRF - 如何处理序列化程序 create() 上的异常?

转载 作者:行者123 更新时间:2023-12-04 13:57:00 27 4
gpt4 key购买 nike

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

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

最佳答案

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

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

您的代码的一些额外提示:
  • 结帐验证和自定义 DRF 验证器 http://www.django-rest-framework.org/api-guide/validators/ .它们可以在类似情况下为您提供帮助,并帮助您将业务逻辑与序列化程序分开
  • 除了命中 3 个不同的异常。要拥有更易于使用的 API,您应该使用单独的错误消息进行响应,以便为客户端提供更多上下文
  • 关于django - DRF - 如何处理序列化程序 create() 上的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46492853/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com