【问题标题】:Refactoring views in Django REST framework在 Django REST 框架中重构视图
【发布时间】:2020-07-11 08:16:34
【问题描述】:

我对 Python 和 Django 非常陌生。我有这个应用程序,它返回 4 种不同类型的运输路线(在代码中我只显示了两种,因为它们基本上是相同的......)。

这 4 个视图使用相同的基于类的视图,但只有模型的名称不同。由于它们都返回相同的功能(获取、发布、放置和删除),我最终一遍又一遍地重复相同的代码。

有什么方法可以更简单地重构它吗?

任何帮助表示赞赏!谢谢你:)

views.py

********* tube view ***********

class TubeListView(APIView):

    def get(self, _request, format=None):
        tubeRoutes = TubeRoute.objects.all()
        serialized_with_user = NestedTubeRouteSerializer(tubeRoutes, many=True)
        return Response(serialized_with_user.data)

    def post(self, request, format=None):
        request.data['traveler'] = request.user.id
        serializer = TubeRouteSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE)


class TubeDetailView(APIView):

    def get(self, _request, pk, format=None):
        tubeRoute = TubeRoute.objects.get(pk=pk)
        serialized_with_user = NestedTubeRouteSerializer(tubeRoute)
        return Response(serialized_with_user.data)


    def put(self, request, pk, format=None):
        request.data['traveler'] = request.user.id
        tubeRoute = self.get_object(pk)
        if tubeRoute.owner.id != request.user.id:
            return Response(status=status.HTTP_401_UNAUTHORIZED)

        updated_serializer = TubeRouteSerializer(tubeRoute)

        if updated_serializer.is_valid():
            updated_serializer.save()
            return Response(updated_serializer.data, status=status.HTTP_200_OK)
        return Response(updated_serializer.errors, status=status.HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE)


    def delete(self, request, pk, format=None):
        tubeRoute = self.get_object(pk)
        if tubeRoute.owner.id != request.user.id:
            return Response(status=status.HTTP_401_UNAUTHORIZED)
        tubeRoute.delete()
        return Response(status=status.HTTP_200_OK)

********* bus view ***********

class BusListView(APIView):

    def get(self, _request, format=None):
        busRoutes = BusRoute.objects.all()
        serialized_with_user = NestedBusRouteSerializer(busRoutes, many=True)
        return Response(serialized_with_user.data)

    def post(self, request, format=None):
        request.data['traveler'] = request.user.id
        serializer = BusRouteSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE)


class BusDetailView(APIView):

    def get(self, _request, pk, format=None):
        busRoute = BusRoute.objects.get(pk=pk)
        serialized_with_user = NestedBusRouteSerializer(busRoute)
        return Response(serialized_with_user.data)


    def put(self, request, pk, format=None):
        request.data['traveler'] = request.user.id
        busRoute = self.get_object(pk)
        if busRoute.owner.id != request.user.id:
            return Response(status=status.HTTP_401_UNAUTHORIZED)

        updated_serializer = BusRouteSerializer(busRoute)

        if updated_serializer.is_valid():
            updated_serializer.save()
            return Response(updated_serializer.data, status=status.HTTP_200_OK)
        return Response(updated_serializer.errors, status=status.HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE)


    def delete(self, request, pk, format=None):
        busRoute = self.get_object(pk)
        if busRoute.owner.id != request.user.id:
            return Response(status=status.HTTP_401_UNAUTHORIZED)
        busRoute.delete()
        return Response(status=status.HTTP_200_OK)

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    你应该看看这些class based views in DRF

    例如,以下代码应该足以替换您的第一个TubeListView

    from rest_framework import generics
    
    class TubeListView(generics.ListCreateAPIView):
        queryset = TubeRoute.objects.all()
        serializer_class = NestedTubeRouteSerializer
    
        def post(self, request, *args, **kwargs):
            request.data['traveler'] = request.user.id
            return super().post(self, request, *args, **kwargs)
    

    如果您不需要任何特殊行为,则不必重新定义 get、post 等方法。但是如果您需要更改数据,例如在您的 POST 方法中,您可以做您的事情,然后使用 super().post(self, request, *args, **kwargs) 调用超类的通常行为

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-07
      • 2014-05-03
      • 1970-01-01
      • 2013-09-20
      • 2023-04-08
      • 2020-08-08
      • 2015-08-04
      • 1970-01-01
      相关资源
      最近更新 更多