<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