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ó anteriormente Danilo Cabello , usaría @detail_route
o @list_route
lugar de @link()
. Lea la documentación de "Enrutadores", sección "Enlace adicional y acciones" y "ViewSets", sección "Marcado de acciones adicionales para el enrutamiento" para obtener explicaciones detalladas.
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.