Django rest ModelViewSet具有不同URL的多个GET请求
我必须这样做:一个图书馆可以有很多书 现在,我有一个URL,用于对特定库中的书籍执行CRUD: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
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)