【问题标题】:django-rest-framework How to handle multiple URL parameter?django-rest-framework 如何处理多个 URL 参数?
【发布时间】:2015-05-11 05:39:45
【问题描述】:
如何使用具有多个 URL 参数的通用视图?喜欢
GET /author/{author_id}/book/{book_id}
class Book(generics.RetrieveAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
lookup_field = 'book_id'
lookup_url_kwarg = 'book_id'
# lookup_field = 'author_id' for author
# lookup_url_kwarg = 'author_id'
【问题讨论】:
标签:
django
python-2.7
django-rest-framework
【解决方案1】:
在这里聚会可能会迟到,但我就是这样做的:
class Book(generics.RetrieveAPIView):
serializer_class = BookSerializer
def get_queryset(self):
book_id = self.kwargs['book_id']
author_id = self.kwargs['author_id']
return Book.objects.filter(Book = book_id, Author = author_id)
【解决方案2】:
加一点custom Mixin:
在urls.py:
...
path('/author/<int:author_id>/book/<int:book_id>', views.Book.as_view()),
...
在views.py:
改编自 DRF documentation 中的示例:
class MultipleFieldLookupMixin:
def get_object(self):
queryset = self.get_queryset() # Get the base queryset
queryset = self.filter_queryset(queryset) # Apply any filter backends
multi_filter = {field: self.kwargs[field] for field in self.lookup_fields}
obj = get_object_or_404(queryset, **multi_filter) # Lookup the object
self.check_object_permissions(self.request, obj)
return obj
class Book(MultipleFieldLookupMixin, generics.RetrieveAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
lookup_fields = ['author_id', 'book_id'] # possible thanks to custom Mixin