я могу фильтровать по URL с помощью Django Rest Framework ViewSet? - PullRequest
0 голосов
/ 19 марта 2020

Есть ли способ фильтрации по 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())
]
...