Вложенные ресурсы в Django REST Framework
Я хочу реализовать свой новый API с вложенным ресурсом.
Example: /api/users/:user_id/posts/
Будет оценивать все сообщения для конкретного пользователя. Я не видел рабочего примера для этого варианта использования, может быть, это неправильный способ реализации API отдыха?
Ответы
Ответ 1
Как прокомментировал Danilo, декоратор @link
был удален в пользу декораторов @list_route
и @detail_route
. 2
Здесь альтернативные решения:
Решение 1:
@detail_route()
def posts(self, request, pk=None):
owner = self.get_object()
posts = Post.objects.filter(owner=owner)
context = {
'request': request
}
post_serializer = PostSerializer(posts, many=True, context=context)
return Response(post_serializer.data)
Решение 2:
Попробуйте drf-nested-routers
. Еще не пробовал это, но выглядит многообещающим, многие уже используют его. Похож на расширенную версию того, что мы уже пытаемся достичь.
Надеюсь, что это поможет.
Ответ 2
Чтобы отобразить /api/users/:user_id/posts/
, вы можете украсить метод posts
внутри ViewSet
с помощью @link()
from rest_framework.decorators import link
class UserViewSet(viewsets.ModelViewSet):
model = User
serializer_class = UserSerializer
# Your regular ModelViewSet things here
# Add a decorated method like this
@link()
def posts(self, request, pk):
# pk is the user_id in your example
posts = Post.objects.filter(owner=pk)
# Or, you can also do a related objects query, something like:
# user = self.get_object(pk)
# posts = user.post_set.all()
# Then just serialize and return it!
serializer = PostSerializer(posts)
return Response(serializer.data)
Ответ 3
Как прокомментированный Данило Кабелло, вы использовали @detail_route
или @list_route
вместо @link()
. Пожалуйста, прочитайте документацию для "Маршрутизаторы" , раздел "Дополнительная ссылка и действия" и "ViewSets" , раздел "Маркировка дополнительных действий для маршрутизации" для подробных объяснений.