2014-11-07 2 views
2

Я использую DRF 2.4.4 и столкнулся с этой проблемой, где декоратор @list_route требует pk. Вот мой фрагмент кода:Django Rest Framework @list_route требует pk

class RunViewSet(ModelViewSet): 
    serializer_class = RunSerializer 
    queryset = Run.objects.all() 

    @list_route() 
    def active(self, request, pk): 
     '''Return active runs.''' 
     qs = Run.objects.all(deleted=False) 
     serializer = RunSerializer(qs, many=True) 
     return Response(serializer.data) 

Если я пытаюсь получить доступ к конечной точке в /api/runs/active я получаю 404 error. Он работает только, если я даю pk, например /api/runs/1/active. Поскольку @list_route должен работать с коллекцией, зачем мне его pk?

ответ

4

Оказалось, что проблема связана с расширенными маршрутизаторами DRF extensions.

+0

Подтвердите свой ответ, если она будет решена. Вы также можете описать проблему. – argaen

+0

Спасибо за upvote @djangozone. Я не могу принять свой ответ прямо сейчас, он говорит мне ждать до завтра. Моя проблема заключалась в том, что я ожидал получить доступ к моей конечной точке списка в/api/running/active, но она не работала с ExtendedDefaultRouter. Я не уверен, в чем проблема с чтением связанного с ним билета, но похоже, что они все еще используют устаревший декоратор «@action» и в ближайшее время не планируют поддерживать «@linked_route». – ybendana

+0

Привет, @ybendana, я столкнулся с той же проблемой. Вы могли найти для этого рабочий стол? –

4

Если у кого-либо еще есть эта проблема, вы можете использовать предлагаемое решение here.

Если вы хотите использовать гнездовые объекты, вы должны смешивать NestedRouterMixin в свой маршрутизатор.

Что я сделал:

from rest_framework.routers import DefaultRouter 
from rest_framework_extensions.routers import NestedRouterMixin 


class NestedDefaultRouter(NestedRouterMixin, DefaultRouter): 
    pass 

# Then you can use your router as usual 
router = NestedDefaultRouter() 
Смежные вопросы