DRF,将检索函数路由到post函数

2024-04-30 06:41:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django rest框架API,它获取POST请求,并且在视图中有一个retrive方法

我希望当用户按下post按钮时,它将URL路由到视图类的retrieve方法中创建的呈现

代码:

#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
                                        )
                          )

任务名称是一个主键,因此要访问检索方法,用户需要转到URL行并写入任务名称以使方法工作

那么,在我的项目(URL、视图…)中,我如何以及在何处创建此路由

例如:

example


Tags: the方法namedatagetrequestlongpoints
1条回答
网友
1楼 · 发布于 2024-04-30 06:41:55

我对这个观点的目的有点困惑

retrieve方法使用pk从queryset列表中检索特定对象时,可以正确使用该方法。例如,您的一个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/的新端点,您可以向该端点发出post请求

你也会注意到我对你的查询集做了一些修改。您当前的查询集为我们提供由任何用户创建的最后一个LocationInfo。您是否在LocationInfo中创建了跟踪创建该LocationInfo的人的字段

以下是此文档:Marking extra actions for routing

注意:我没有测试这段代码,所以如果你复制粘贴这段代码,它可能不起作用,但这个想法很重要

相关问题 更多 >