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

Python DRF,将检索函数路由到post函数,python,django-rest-framework,routing,Python,Django Rest Framework,Routing,我有一个Django rest框架API,它获取POST请求,并且在视图中有一个retrive方法 我希望当用户按下post按钮时,它将URL路由到视图类的retrieve方法中创建的呈现 代码: #views.py 类位置信息视图集(ModelViewSet): #按id对所有对象进行排序,反向排列。 queryset=LocationInfo.objects.all().order_by('-id')) serializer\u class=LocationInfoSerializer de

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

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

代码:

#views.py
类位置信息视图集(ModelViewSet):
#按id对所有对象进行排序,反向排列。
queryset=LocationInfo.objects.all().order_by('-id'))
serializer\u class=LocationInfoSerializer
def检索(self、request、*args、**kwargs):
"""
此方法用于获取用户创建的最后一个对象,并渲染与该对象关联的贴图
任务的名字。
"""
data=self.queryset[0]
serialized_data=LocationInfoSerializer(data,many=False)
点=列表(序列化的_data.data.values())
指定_gdt1=地质点(纬度=点[2],长=点[3])
指定_gdt2=地质点(纬度=点[4],长=点[5])
指定=地质点(纬度=点[6],长=点[7],高程=点[-3])
#来自POST请求的地理位置。
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()]
任务名称=点数[1]
尝试:
#检查数据库中是否已存在文件。
HTMLFileInteractionWithDB.table=三个点
openfile=HTMLFileInteractionWithDB。从数据库返回文件(任务名称=任务名称)
返回渲染(请求,打开文件)
除:
#如果不存在新文件,请创建新文件。
#main函数创建要呈现的HTML文件。
返回渲染(请求、主(gdt1、gdt2、uav、,
gdt1_elev=assign_gdt1.get_elevation(),
gdt2_elev=分配_gdt2.get_高程(),
任务名称=任务名称
)
)
任务名称是一个主键,因此要访问检索方法,用户需要转到URL行并写入任务名称以使方法工作

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

例如:


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

使用pk从queryset列表中检索特定对象时,正确使用了
retrieve
方法。例如,您的一个LocationInfo对象。这总是一个get请求

您的检索方法也缺少pk参数,该参数有时默认为None。
检索(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的人的字段

以下是这方面的文档:


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

为什么要在rest API中实现路由?听起来很奇怪!相反,您可以在post请求完成时向用户发送自定义响应。。