Django rest ModelViewSet具有不同URL的多个GET请求

Django rest ModelViewSet具有不同URL的多个GET请求,django,django-rest-framework,django-rest-viewsets,Django,Django Rest Framework,Django Rest Viewsets,我必须这样做:一个图书馆可以有很多书 现在,我有一个URL,用于对特定库中的书籍执行CRUD: router.register(r'books/(?p[0-9]+)”,BookViewSet,base_name='books') 以及相应的观点: class BookViewSet(viewsets.ModelViewSet): serializer_class = BookSerializer def get_queryset(self): genre_qu

我必须这样做:一个图书馆可以有很多书

现在,我有一个URL,用于对特定库中的书籍执行CRUD:

router.register(r'books/(?p[0-9]+)”,BookViewSet,base_name='books')

以及相应的观点:

class BookViewSet(viewsets.ModelViewSet):

    serializer_class = BookSerializer
    def get_queryset(self):

        genre_query = self.request.query_params.get('genre', None)
        status_query = self.request.query_params.get('status', None)
        author_query = self.request.query_params.get('author', None)

        books = Book.objects.filter(which_library=self.kwargs.get('library_id'))
        if genre_query:
            books = books.filter(genre=genre_query)
        if status_query:
            books = books.filter(status=status_query)
        if author_query:
            books = books.filter(author=author_query)
        return books 
我最初没有使用ModelViewSet,而是使用带有@api\u视图装饰器的函数,其中一个是以下内容(返回过去两周添加的书籍,我有一个单独的URL作为此函数的api/books//new\u arrivals):


在使用ModelViewSet时,我如何才能做到这一点?我必须添加另一个URL,然后为新到达的用户编写另一个类,还是在现有BookViewSet中编写函数?在这种情况下,如何处理这两种GET方法?

您可以通过添加特殊方法
list\u route
detail\u route
来扩展传统的viewSet。使用此装饰器,您可以添加ViewSet生成的新URL。在这种情况下,更适合:

from rest_framework.decorators import list_route

class BookViewSet(viewsets.ModelViewSet):
    ...
    @list_route()
    def new_arrivals(self, request):
        books = self.get_queryset()
        d=timezone.now()-timedelta(days=14)
        books = books.filter(when_added__gte=d 
        serializer = self.get_serializer(books, many=True)
        return Response(serializer.data)

这将向视图集中添加额外的url:
图书/{library\u id}/new\u arrivals
列表路径
详细路径
被折旧,并与装饰器操作合并


再次感谢您!现在,我有了一个使用ModelViewSet的所有不同可能性的完整工作示例:)
from rest_framework.decorators import list_route

class BookViewSet(viewsets.ModelViewSet):
    ...
    @list_route()
    def new_arrivals(self, request):
        books = self.get_queryset()
        d=timezone.now()-timedelta(days=14)
        books = books.filter(when_added__gte=d 
        serializer = self.get_serializer(books, many=True)
        return Response(serializer.data)