Есть ли способ фильтрации по URL (как описано здесь ) с использованием DRF ViewSet?
У меня есть следующий вид кода:
models.py :
class Author(models.Model):
name = models.CharField()
class Book(models.Model):
title = models.CharField()
author = models.ForeignKey(Author, related_name="books")
views.py :
class BookViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = BookSerializer
def get_queryset(self):
author = self.kwargs["author"]
return Book.objects.filter(author__name=author)
urls.py :
api_router = SimpleRouter()
api_router.register(r"books/<str:author>", BookViewSet)
urlpatterns = [
path("", include(api_router.urls))
]
Но этот шаблон на самом деле соответствует URL /books/<str:author>
( с угловыми скобками ) вместо того, чтобы позволить мне ввести что-то вроде /books/shakespeare
и вернуть все книги с автором "Шекспир".
Можно ли сделать этот вид фильтра с помощью ViewSet?
ОБНОВЛЕНИЕ:
Мне удалось заставить его работать для отдельного ListAPIView и RetrieveAPIView. Это, вероятно, достаточно хорошо, но если кто-нибудь знает, как это сделать с помощью ViewSet, тогда я слушаю.
views.py :
class BookListView(generics.ListAPIView):
serializer_class = BookSerializer
def get_queryset(self):
author = self.kwargs["author"]
return Book.objects.filter(author__name=author)
urls.py :
urlpatterns = [
re_path(r"^books/(?P<author>.+)/$", BookListView.as_view())
]