python - create - django rest framework response
Devuelve el usuario actual con Django Rest Framework (5)
Con algo como esto, es mejor que salgas de las vistas genéricas y escribas la vista tú mismo.
@api_view([''GET''])
def current_user(request):
serializer = UserSerializer(request.user)
return Response(serializer.data)
También podría hacer lo mismo usando una vista basada en clases como tal ...
class CurrentUserView(APIView):
def get(self, request):
serializer = UserSerializer(request.user)
return Response(serializer.data)
Por supuesto, tampoco hay ningún requisito de que use un serializador, también podría simplemente extraer los campos que necesita de la instancia del usuario.
@api_view([''GET''])
def current_user(request):
user = request.user
return Response({
''username'': user.username,
''email'': user.email,
...
})
Espero que ayude.
Actualmente estoy desarrollando una API usando Django.
Sin embargo , me gustaría crear una vista que devuelva el usuario actual con el siguiente punto final: /users/current
.
Para hacerlo, creé una vista de lista y filtré el conjunto de preguntas al usuario que realizó la solicitud. Eso funciona, pero el resultado es una lista, no un solo objeto. Combinado con la paginación, el resultado parece demasiado complicado e inconsistente con los otros puntos finales.
También traté de crear una vista de detalle y filtrar el queryset, pero DRF se queja de que no proporcioné pk o slug.
Tiene alguna idea ?
En lugar de usar toda la potencia de ModelViewSet, puede usar mixins. Hay RetrieveModelMixin usado para recuperar un solo objeto tal como se menciona aquí - http://www.django-rest-framework.org/api-guide/viewsets/#example_3
class UserViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
def get_object(self):
return self.request.user
Si también necesita actualizar su modelo, simplemente agregue UpdateModelMixin.
La mejor manera es usar la potencia de viewsets.ModelViewSet
como viewsets.ModelViewSet
:
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
def get_object(self):
pk = self.kwargs.get(''pk'')
if pk == "current":
return self.request.user
return super(UserViewSet, self).get_object()
viewsets.ModelViewSet
es una combinación de mixins.CreateModelMixin
+ mixins.RetrieveModelMixin
+ mixins.UpdateModelMixin
+ mixins.DestroyModelMixin
+ mixins.ListModelMixin
+ viewsets.GenericViewSet
. Si necesita solo listar todo o obtener un usuario particular, incluido el autenticado actualmente, solo tiene que reemplazarlo así
class UserViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
# ...
Si debe usar el conjunto de vistas genérico por algún motivo, podría hacer algo como esto,
class UserViewSet(viewsets.ModelViewSet):
model = User
serializer_class = UserSerializer
def get_object(self):
return self.request.user
def list(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
retrieve
método de retrieve
se invoca cuando el cliente solicita una instancia única utilizando un identificador como una clave principal /users/10
que activaría normalmente el método de recuperación. Recuperarse a sí mismo llamadas get_object
. Si desea que la vista siempre devuelva la corriente utilizada, puede modificar los get_object
y force list
para devolver un solo elemento en lugar de una lista llamando y devolviendo self.retrieve
dentro de él.
Usé un ModelViewSet así:
class UserViewSet(viewsets.ModelViewSet):
model = User
serializer_class = UserSerializer
def dispatch(self, request, *args, **kwargs):
if kwargs.get(''pk'') == ''current'' and request.user:
kwargs[''pk''] = request.user.pk
return super(UserViewSet, self).dispatch(request, *args, **kwargs)