Структура Django rest: параметры запроса в detail_route

У меня есть следующий ViewSet:

class BookViewSet(DefaultsMixin, viewsets.ModelViewSet):
   queryset = Book.objects.all()
   serializer_class = BookSerializer

   @detail_route()
   def chapter(self, request,pk=None):
       queryset = Chapter.objects.filter(book__pk=pk)
       serializer = ChpaterSerializer(queryset,
                       context={'request':request},
                       many=True)
       return Response(serializer.data)

Таким образом, URL-адрес/книга/{id}/chapter "действителен. Но я не знаю, как я могу настроить ViewSet на наличие URL-адреса, например "/book/{id}/chapter/{id}". Возможно, ответ использует lookup_field или lookup_url_kwarg, но я не могу их использовать в case_route.

Ответы

Ответ 1

вы можете сделать это, добавив url_path в detail_route как:

@detail_route(url_name='chapter', url_path='chapter/(?P<chapter_id>[0-9]+)')
def chapter(self, request, pk=None, chapter_id=None):
   queryset = Chapter.objects.filter(book__pk=pk)
   serializer = ChpaterSerializer(queryset,
                   context={'request':request},
                   many=True)
   return Response(serializer.data)

Обратите внимание, что имя URL-адреса маршрутизатора по умолчанию по умолчанию соответствует аргументу url_path, если оно предоставлено. Таким образом, имя представления будет включать строку параметров запроса. Указав аргумент url_name, вы можете это упростить. Я бы рекомендовал использовать там имя метода, которое является значением по умолчанию, если url_path не указано. При этом вы можете изменить URL-адрес с помощью

reverse('book-chapter', kwargs={'pk': 1, 'chapter_id': 4})

Ответ 2

  • Для URL-адреса конечной точки как: (используя Django REST ViewSets)

{mysite}/users/{pk}/password/{id}

для этого я работаю в своих представлениях:

class UsersViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer


@detail_route(url_path='password')
def password(self, request,pk=None):
    return HttpResponse("Wow! It Works")

сверху вы можете получить идентификатор из url через переменную pk.

  1. Для EndPoint Url as

    {MySite}/пользователей/{рк}/пароль/{номер}

Измените приведенный выше метод пароля на

@detail_route(url_path='password/(?P<number>[0-9]+)')
def password(self, request,pk=None, number=None):
    return HttpResponse("Wow! It Again Works")