Django rest framework django rest framework-覆盖ViewSet.ViewSet#检索以便为查找资源使用2个参数

Django rest framework django rest framework-覆盖ViewSet.ViewSet#检索以便为查找资源使用2个参数,django-rest-framework,routes,Django Rest Framework,Routes,我想使用两个模型的属性来查找路线的记录 型号.py class Route(DateTimeModel): start_poi = models.ForeignKey(Poi, related_name="start_pois", on_delete=models.CASCADE) end_poi = models.ForeignKey(Poi, related_name="end_pois", on_delete=models.CASCADE) ... def

我想使用两个模型的属性来查找
路线的记录

型号.py

class Route(DateTimeModel):
    start_poi = models.ForeignKey(Poi, related_name="start_pois", on_delete=models.CASCADE)
    end_poi = models.ForeignKey(Poi, related_name="end_pois", on_delete=models.CASCADE)
    ...

    def __str__(self):
        return 'From %s to %s' % (self.start_poi.slug, self.end_poi.slug)
class RouteViewSet(viewsets.ViewSet):
    http_method_names = ['get']

    @staticmethod
    def list(request):
        queryset = ...

        serializer = RouteSerializer(queryset, many=True)
        return Response(serializer.data)

    @staticmethod
    def retrieve(request, from_poi_slug, to_poi_slug):
        queryset = ...

        route = get_object_or_404(queryset, from_poi_slug=from_poi_slug, to_poi_slug=to_poi_slug)
        serializer = RouteSerializer(route)
        return Response(serializer.data)
urlpatterns.extend([
    path(rf'{BASE_API_PATH}/routes/(?P<from_poi_slug>[-\w]+)/(?P<to_poi_slug>[-\w]+)', RouteViewSet),
])
视图.py

class Route(DateTimeModel):
    start_poi = models.ForeignKey(Poi, related_name="start_pois", on_delete=models.CASCADE)
    end_poi = models.ForeignKey(Poi, related_name="end_pois", on_delete=models.CASCADE)
    ...

    def __str__(self):
        return 'From %s to %s' % (self.start_poi.slug, self.end_poi.slug)
class RouteViewSet(viewsets.ViewSet):
    http_method_names = ['get']

    @staticmethod
    def list(request):
        queryset = ...

        serializer = RouteSerializer(queryset, many=True)
        return Response(serializer.data)

    @staticmethod
    def retrieve(request, from_poi_slug, to_poi_slug):
        queryset = ...

        route = get_object_or_404(queryset, from_poi_slug=from_poi_slug, to_poi_slug=to_poi_slug)
        serializer = RouteSerializer(route)
        return Response(serializer.data)
urlpatterns.extend([
    path(rf'{BASE_API_PATH}/routes/(?P<from_poi_slug>[-\w]+)/(?P<to_poi_slug>[-\w]+)', RouteViewSet),
])
url.py

class Route(DateTimeModel):
    start_poi = models.ForeignKey(Poi, related_name="start_pois", on_delete=models.CASCADE)
    end_poi = models.ForeignKey(Poi, related_name="end_pois", on_delete=models.CASCADE)
    ...

    def __str__(self):
        return 'From %s to %s' % (self.start_poi.slug, self.end_poi.slug)
class RouteViewSet(viewsets.ViewSet):
    http_method_names = ['get']

    @staticmethod
    def list(request):
        queryset = ...

        serializer = RouteSerializer(queryset, many=True)
        return Response(serializer.data)

    @staticmethod
    def retrieve(request, from_poi_slug, to_poi_slug):
        queryset = ...

        route = get_object_or_404(queryset, from_poi_slug=from_poi_slug, to_poi_slug=to_poi_slug)
        serializer = RouteSerializer(route)
        return Response(serializer.data)
urlpatterns.extend([
    path(rf'{BASE_API_PATH}/routes/(?P<from_poi_slug>[-\w]+)/(?P<to_poi_slug>[-\w]+)', RouteViewSet),
])
urlpatterns.extend([
路径(rf'{BASE\u API\u path}/routes/(?P[-\w]+)/(?P[-\w]+)”,RouteViewSet),
])
我明白了

未找到:/api/v1/routes/xyz/abc [2019年4月29日10:07:01]“GET/api/v1/routes/molo santa maria/kennedy ne HTTP/1.1”404 13191

我错过了什么?
如何正确覆盖
#检索
并正确配置
URL

由于您仅使用读取操作,因此可以使用
ReadOnlyModelViewSet

#views.py
class RouteViewSet(viewsets.ReadOnlyModelViewSet):
    http_method_names = ['get']

    def list(self, request, *args, **kwargs):
        queryset = ...

        serializer = RouteSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, *args, **kwargs):
        from_poi_slug = kwargs['from_poi_slug']
        to_poi_slug = kwargs['to_poi_slug']
        queryset = ...

        route = get_object_or_404(queryset, from_poi_slug=from_poi_slug, to_poi_slug=to_poi_slug)
        serializer = RouteSerializer(route)
        return Response(serializer.data)

为什么
staticmethod
?避免在方法签名中引用self;实际上它是由IDE(PyCharm)提出的,但我认为这与问题无关……它应该是实例方法而不是
staticmethod
,因为
ViewSet
期望它是一种实例方法好的,我会根据我得到的结果更改它:调用
时必须提供
actions
参数
在视图集上。例如
.as_视图({'get':'list'})
。如果我添加
{'get':'retrieve'}
我仍然会得到一个404I,最终使用
GetRoute(APIView)
解决了这个问题,但是我觉得必须有一种更为django的方法来完成它,方法是重写
ReadOnlyModelViewSet#retrieve方法
您在as_view()中尝试过{“get”:“retrieve”}吗??