django rest框架perform_update或post_save返回自定义响应

Mir*_*lic 2 django django-rest-framework

当对象超过8分钟时,如何返回自定义响应json错误.

这是我的代码,但响应不起作用:

def perform_update(self, serializer):
    instance = serializer.save()
    diff_minutes = (datetime.now() - instance.ordered_date).total_seconds() / 60
    if diff_minutes > 8:
        return Response({'expired': True}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    self.post_save(instance)
Run Code Online (Sandbox Code Playgroud)

同样这是我使用的时候post_save.

我没有得到任何回应,它总是通过.

有什么建议吗?

小智 6

因为你想特别返回500错误,所以你可以提出一个APIException.例如:

from rest_framework.exceptions import APIException

def perform_update(self, serializer):
    instance = serializer.save()
    diff_minutes = (datetime.now() - instance.ordered_date).total_seconds() / 60
    if diff_minutes > 8:
        raise APIException("expired")
    self.post_save(instance)
Run Code Online (Sandbox Code Playgroud)

提升APIException将触发该.handle_exception(self, exc)功能.默认情况下会返回如下结果:

{detail : "expired" }

和状态代码500.如果您需要更多地控制确切的返回值/状态代码,您可以覆盖该handle_exception函数并让它返回您喜欢的任何内容.

此外,由于显然我没有足够的代表评论,因为你质疑上一个发布的解决方案,说明你只想在更新时进行验证.您只能覆盖update()序列化程序中的函数,并且只会在更新时调用该函数,而不是create()在创建新对象时调用该函数.


小智 5

在的代码rest_frameworkperfrom_update被称为是这样的:

class UpdateModelMixin(object):
    """
    Update a model instance.
    """
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

如果你想修改响应的内容,你可以修改serializer.data,但是你不能对状态做任何事情,因为它不是正确的地方

要验证您的数据,您应该添加一个验证器,如文档http://www.django-rest-framework.org/api-guide/serializers/#validation 中所述