<int:pk> не работает внутри маршрутизатора в REST-фреймворке Django

У меня есть следующий код внутри urls.py:

from django.urls import path, include
from rest_framework.routers import DefaultRouter

from .views import SentenceListViewSet, SentenceViewSet

router = DefaultRouter()
router.register('lists', SentenceListViewSet, basename='SentenceList')
router.register('lists/<int:pk>/sentences/', SentenceViewSet, basename='Sentence')

app_name = 'api_app'
urlpatterns = [
    path('', include(router.urls), name='lists')
]

Проблема со вторым реестром маршрутизатора. Я получаю "страница не найдена", если перехожу к localhost:8000/lists/8/sentences. Однако я могу получить доступ к localhost:8000/lists/<int:pk>/sentences.

Как сделать так, чтобы DRF захватывал 8 в качестве параметра URL вместо того, чтобы int:pk воспринимался как буквальная часть URL?

Чтобы ответить на ваш вопрос, когда у вас есть конфигурация url, как у вас есть сейчас, вы можете переопределить get_queryset() метод вашего набора представлений.

Определите get queryset на вашем представлении, используйте self.kwargs для фильтра, и я предполагаю, что это будет выглядеть примерно так:

def get_queryset(self, queryset=None):
    qs = super().get_queryset(queryset=queryset)
    return qs.filter(field_name=self.kwargs.get("pk")

Подробности см. в документации здесь:

https://www.django-rest-framework.org/api-guide/filtering/#filtering

На этой странице также содержатся подробности, касающиеся вашего вопроса, как достичь того же самого, но с параметрами запроса вместо этого, немного дальше по странице, здесь:

https://www.django-rest-framework.org/api-guide/filtering/#filtering-against-query-parameters

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

Я могу категорически сказать вам, что мой первый выбор - иметь его в параметре url, потому что django может обрабатывать маршрутизацию лучше таким образом. Параметры запроса немного отличаются друг от друга. И когда вы обращаетесь к урлам, обычно вы предоставляете аргументы url, а не параметры запроса. Хотя это всего лишь мои два цента.

В зависимости от того, чего вы пытаетесь достичь, я думаю, вы неправильно понимаете, что такое ViewSet. Viewset является довольно общим, и вы можете использовать ModelViewSet, чтобы сэкономить себе много времени.

https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset

При ближайшем рассмотрении я уверен, что вы используете ViewSet, когда вы должны использовать ModelViewSet, но опять же, не хватает требуемого кода, чтобы сказать наверняка

Если ваш класс представления наследуется от generics.ModelViewSet, вам не нужно указывать pk в url

Вернуться на верх