django-rest-framework 如何处理多个 URL 参数?

django-rest-framework How to handle multiple URL parameter?

如何使用具有多个 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'

You'll need to use named groups in your URL structure and possibly override the get() method of your view.

加一点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

参加这里的聚会可能会迟到,但这就是我的工作:

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)