Рефакторинг представлений в Django REST framework - PullRequest
0 голосов
/ 30 марта 2020

Я очень плохо знаком с 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)

1 Ответ

0 голосов
/ 31 марта 2020

Вам следует взглянуть на эти классовые представления в 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 и др. c. Но если вам нужно изменить данные, например, в вашем методе POST, вы можете выполнить свою работу и затем вызвать обычное поведение суперкласса с помощью super().post(self, request, *args, **kwargs)

...