Django rest框架在viewset @detail_route中使用serializer_class

时间:2017-10-11 17:36:46

标签: django django-rest-framework django-rest-viewsets

我正在使用 viewsets ,包含大量@detail_route@list_route。在普通的视图集中,我使用serializer_class,然后使用序列化程序中的一些验证,但在@detail_route

我正在视图中创建序列化程序并在此处检查验证 - 我知道它很糟糕。

我的问题是如何使用@detail_route像普通modelviewset一样使用,而无需手动创建序列化程序,但在装饰器中使用serializer_class

可以在@detail_route

中没有任何附加代码进行瘟疫

最好重构代码并将@detail_route@list_route移到分离的视图集或保留在viewsets方法上?

@rest_framework.decorators.detail_route(methods=['post'],
                                        serializer_class=orders_serializers.ChangeOrderStatusSerializer)
def change_status(self, request, pk=None):
    serializer = self.get_serializer(data=request.data)

    if serializer.is_valid():
        new_status = serializer.validated_data.get('status')
        order = self.get_object()

            if new_status in [orders_models.Order.EXECUTE, orders_models.Order.OUTSIDE]:
                order.status = new_status
                order.save()

                return Response({
                    'status': order.get_status_display()
                }, status=status.HTTP_200_OK)
            else:
                return Response('This new status is invalid for this order.',
                                status=status.HTTP_404_NOT_FOUND)
    else:
        return Response(serializer.errors,
                        status=status.HTTP_400_BAD_REQUEST)

0 个答案:

没有答案