Вложенные ресурсы в 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" , раздел "Маркировка дополнительных действий для маршрутизации" для подробных объяснений.