DRF (django-rest-framework) действие декоратора не работает - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть это представление класса, которое отлично подходит для создания и перечисления объектов SiteGroup:

Но мне нужен метод для выполнения нескольких операций над одним объектом SiteGroup и объектами, связанными с ними. Поэтому я попытался создать метод, украшенный @action (как предложено в документах).

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

Когда я пытаюсь получить доступ (учитывая, что 423 является существующим объектом SiteGroup):

http://127.0.0.1:8000/api/site-groups/423/replace_product_id/?product_id=0x345

URL не найден.

Я также попытался сгенерировать себе URL в urls.py, но безуспешно.

Может кто-нибудь сказать мне, где проблема? Я просмотрел все документы и не нашел подсказки. Большое спасибо.

class SiteGroupDetail(generics.ListCreateAPIView):
    queryset = SiteGroup.objects.all()
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    serializer_class = SiteGroupSerializer
    authentication_classes = (authentication.TokenAuthentication,)

    @action(detail=True, methods=['post'], url_path='replace_product_id', permission_classes=[IsSuperUser], url_name='replace_product_id')
    def replace_product_id(self, request, pk=None, device_type=None):
        serializer = SiteGroupSerializer(data=request.data)
        product_id = self.request.query_params.get('product_id', None)
        print("replace_product", product_id, device_type, pk, flush=True)
        return Response({"hello":product_id})

Мой urls.py

from django.conf.urls import url, include

from api import views, routers

router = routers.SimpleRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
enter code here
    url(r'^site-groups/', views.SiteGroupDetail.as_view()),

    url(r'^site-groups/(?P<pk>[0-9]+)/$', views.SiteGroupDetail.as_view()),

]

1 Ответ

0 голосов
/ 09 ноября 2018

Во-первых, маршрутизатор должен звонить

super(OptionalSlashRouter, self).__init__()

То, что вы сейчас называете __init__ родителя SimpleRouter, пропуская логику в SimpleRouter.__init__

Измените это и посмотрите, начнет ли оно работать

На самом деле, поскольку вы используете Python 3, это может быть просто

super ().__init__()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...