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”}吗??