with routers get_object_or_404 framework create python django rest django-rest-framework nested-resources

python - routers - Recursos anidados en Django REST Framework



routers django rest framework (3)

Para asignar /api/users/:user_id/posts/ puede decorar un método de posts dentro de su ViewSet con @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)

Deseo implementar mi nueva API con un recurso anidado.

Example: /api/users/:user_id/posts/

Evaluará todas las publicaciones para un usuario específico. No he visto un ejemplo que funcione para este caso de uso, tal vez esta no sea la forma correcta de implementar la API de descanso.



Como comentó Danilo , el decorador de @link se eliminó a favor de los decoradores @list_route y @detail_route . 2

Aquí están las soluciones alternativas:

Solución 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)

Solución 2:

Pruebe los drf-nested-routers . Todavía no lo he probado, pero parece prometedor, muchos ya lo están usando. Parece una versión avanzada de lo que ya estamos tratando de lograr.

Espero que esto ayude.