Django Rest Framework - страница сведений о @detail_route

Я использую @detail_route в своих наборах представлений.

class CompanyViewSet(viewsets.ModelViewSet):
    queryset = Company.objects.all()
    serializer_class = serializers.CompanySerializer

    @detail_route(methods=['get', ], permission_classes=[IsCompanyUserPermission, ])
    def accounts(self, request, pk):
    ...
    return Response(...)

# urls.py
router.register(r'companies', views.CompanyViewSet)

этот код создает URL:

/companies/
/companies/{id}
/companies/{id}/accounts

Я не знаю, как добавить маршрут / представление в подробный аккаунт:

/companies/{id}/accounts/{id_account}

Есть ли способ добавить маршрут и представления для обработки этого маршрута?

(лучший вариант - добавить это в CompanyViewSet)

Ваше здоровье,


person user3900778    schedule 18.09.2014    source источник


Ответы (2)


DRF не обрабатывает вложенные маршруты самостоятельно, вы можете обрабатывать их вручную или использовать расширение, например drf- nested-router, но он устарел.

Мой совет: не боритесь с фреймворком, DRF не умеет играть с ресурсами, вложенными в url, сделайте это по-другому.

person Jocelyn delalande    schedule 07.01.2015
comment
Забавно, что это принятый и одобренный ответ ... просто говоря, что вам следует сделать это по-другому, но другого способа не предлагается - person stephen; 07.09.2017
comment
@ surfer190 справиться с этим вручную - реальное решение. Не борись с фреймворком - это совет, чтобы не терять дни, пытаясь сделать его автоматическим в рамках фреймворка, в котором нет этой функции. PS и самое главное: это был единственный ответ до вчерашнего дня - person Jocelyn delalande; 08.09.2017
comment
Приношу свои извинения, если я показался грубым. Поэтому, когда вы говорите «обрабатывать вручную», вы имеете в виду расширение с APIView и создание настраиваемого URL-адреса. - person stephen; 08.09.2017

Так что избегайте этого, когда можете ... но иногда имеет смысл вкладывать ресурсы или методы

Итак, чтобы в вашем случае обрабатывать как accounts/ url, так и accounts/{account_id}, вы определяете другой подробный маршрут.

Вы уже определили функцию для accounts, поэтому вы просто добавляете другую функцию с другим именем и убедитесь, что добавили url_path, чтобы вы могли получить переменную account_id.

        @detail_route(methods=['get', ], permission_classes=[IsCompanyUserPermission, ])
        def accounts(self, request, pk):
        ...
        return Response(...)

        @detail_route(methods=['get', ], permission_classes=[IsCompanyUserPermission, ], 
                      url_path='^queues/(?P<account_id>[0-9]+)')
        def account_detail(self, request, pk, account_id):
        ...
        return Response(...)

В этом ответе аналогичный ответ использовался в качестве справочного материала.

person stephen    schedule 07.09.2017
comment
Хорошо :), пока я сам отвечал / боролся, url_path не существовало. Сейчас нет времени проверять. OP обратная связь приветствуется! - person Jocelyn delalande; 08.09.2017