DRF, перенаправьте функцию получения на функцию публикации - PullRequest
0 голосов
/ 21 марта 2020

У меня есть Django API остального фреймворка, который получает запрос POST и имеет метод retrive в представлении.

Я хочу, чтобы, когда пользователь нажимает кнопку публикации, он направлял URL-адрес для рендеринга созданный в методе получения класса представления.

код:

#views.py


class LocationInfoViewSet(ModelViewSet):
    # Order all objects by id, reversed.
    queryset = LocationInfo.objects.all().order_by('-id')
    serializer_class = LocationInfoSerializer

    def retrieve(self, request, *args, **kwargs):
        """
        This method is used to get the last object created by the user and render a map associated with the
        mission's name.
        """

        data = self.queryset[0]
        serialized_data = LocationInfoSerializer(data, many=False)
        points = list(serialized_data.data.values())

        assign_gdt1 = GeoPoint(lat=points[2], long=points[3])
        assign_gdt2 = GeoPoint(lat=points[4], long=points[5])
        assign_uav = GeoPoint(lat=points[6], long=points[7], elevation=points[-3])

        # Geo locations from the POST request.
        gdt1 = [assign_gdt1.get_lat(), assign_gdt1.get_long()]
        gdt2 = [assign_gdt2.get_lat(), assign_gdt2.get_long()]
        uav = [assign_uav.get_lat(), assign_uav.get_long(), assign_uav.get_elevation()]

        mission_name = points[1]

        try:
            # Check if a file already exists in the DB.
            HTMLFileInteractionWithDB.table = THREE_POINTS_TRINAGULATION
            openfile = HTMLFileInteractionWithDB.return_file_from_db(mission_name=mission_name)
            return render(request, openfile)
        except:
            # Create a new file if one does not exists.
            # The main function Creates an HTML File to be rendered.
            return render(request, main(gdt1, gdt2, uav,
                                        gdt1_elev=assign_gdt1.get_elevation(),
                                        gdt2_elev=assign_gdt2.get_elevation(),
                                        mission_name=mission_name
                                        )
                          )

имя миссии является первичным ключом, поэтому для доступа к методу получения пользователю необходимо go к В строке URL введите имя миссии для работы метода.

Итак, как и где в моем проекте (urls, view ...) мне создать этот маршрут.

Exmpale:

example

1 Ответ

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

Я немного сбит с толку относительно цели этого представления.

Метод retrieve правильно используется, когда он извлекает указанный объект c из списка наборов запросов, используя pk. IE, один из ваших объектов LocationInfo. Это всегда запрос get.

В вашем методе получения также отсутствует параметр pk, который по умолчанию иногда равен None. retrieve(self, request, pk=None)

Если бы вы были на вашем месте, я бы создал для этого совершенно отдельный метод представления или метод / действие.

Вместо использования retrieve для этого мы можем создать полностью новый метод:

from rest_framework.decorators import action

class LocationInfoViewSet(ModelViewSet):
    # Order all objects by id, reversed.
    queryset = LocationInfo.objects.all().order_by('-id')
    serializer_class = LocationInfoSerializer

    # {The rest of your methods, etc...}

    @action(detail=False, methods=["post"])
    def last_object_by_user(self, request, *args, **kwargs):
        # your query to get the last object by your user
        queryset = LocationInfo.objects.filter(created_by=request.user).latest()
        # The rest of your code

Это создаст новую конечную точку с именем / {name} / last_object_by_user /, к которой вы можете отправлять запросы.

Вы также заметили, что я изменил Ваш набор запросов немного. Ваш текущий набор запросов дает нам последнее LocationInfo, созданное любым пользователем. Вы создали поле в LocationInfo, которое отслеживает, кто создал это LocationInfo?

Вот документация для этого: Пометка дополнительных действий для маршрутизации

Примечание: я не проверял это код, так что если вы скопируете и вставите это, это может не сработать, но идея в том, что важно.

...