framework create python django api django-rest-framework

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)