django rest framework - переопределить viewsets.ViewSet # получить, чтобы использовать 2 параметра для ресурса поиска - PullRequest
1 голос
/ 29 апреля 2019

Я хотел бы использовать два атрибута модели для поиска записи Route

models.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)

представлений.py

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)

urls.py

urlpatterns.extend([
    path(rf'{BASE_API_PATH}/routes/(?P<from_poi_slug>[-\w]+)/(?P<to_poi_slug>[-\w]+)', RouteViewSet),
])

Я получаю

Не найдено: / api / v1 /маршруты / xyz / abc [29 / апр / 2019 10:07:01] "GET / api / v1 / маршруты / моло-санта-мария / кеннеди-нэ HTTP / 1.1" 404 13191

Что мне не хватает?Как правильно переопределить #retrieve и правильно настроить urls?

1 Ответ

1 голос
/ 29 апреля 2019

Поскольку вы используете только операции чтения, вы можете использовать ReadOnlyModelViewSet.

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

    <b>def list(self, request, *args, **kwargs):</b>
        queryset = ...

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

    <b>def retrieve(self, request, *args, **kwargs):
        from_poi_slug = kwargs['from_poi_slug']
        to_poi_slug = kwargs['to_poi_slug']</b>
        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)

и в своем urls.py

urlpatterns.extend([
    path(rf'{BASE_API_PATH}/routes/(<from_poi_slug>)/(<to_poi_slug>)/', RouteViewSet.as_view({"get": "retrieve"})),
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...