Quando que devo usar um ou outro?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Quando que devo usar um ou outro?
Olá João, tudo bem com você?
Peço desculpas pela demora em obter um retorno.
Tanto @action quanto @api_view são decoradores usados no Django REST framework (DRF) para criar endpoints de API. @api_view é usado para definir uma view personalizada para um endpoint, enquanto @action é usado para criar uma rota personalizada para uma ação específica que pertence a um endpoint de modelo.
@api_view é um decorador que define a view da API, indicando qual método HTTP é permitido naquela view, assim como processar dados enviados por meio do request e retornar uma resposta. Por exemplo, se você quiser criar uma view que permita apenas solicitações HTTP GET, você pode usar o @api_view(['GET']) decorator. Aqui está um exemplo:
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view(['GET'])
def minha_visao(request):
# Sua lógica aqui
return Response({'mensagem': 'Olá, mundo!'})
Por outro lado, @action é um decorador que é usado para criar uma rota personalizada para uma ação específica que não é um CRUD (criar, ler, atualizar e excluir) comum, mas que pertence a um endpoint do modelo. Por exemplo, suponha que você tenha um modelo Produto e queira criar uma rota personalizada para marcar um produto como favorito:
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
class ProdutoViewSet(ModelViewSet):
queryset = Produto.objects.all()
serializer_class = ProdutoSerializer
@action(detail=True, methods=['POST'])
def marcar_favorito(self, request, pk=None):
produto = self.get_object()
produto.favorito = True
produto.save()
return Response({'mensagem': 'Produto marcado como favorito!'})
Aqui, @action é usado para definir a rota personalizada marcar_favorito que recebe uma solicitação HTTP POST e chama o método marcar_favorito no objeto ProdutoViewSet.
Espero ter lhe ajudado. Em caso de dúvidas estou à disposição.
Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.
Abraços e bons estudos!
Mas na prática não há diferença, certo? Ambos os decoradores criam rotas a partir de funções. Uma sendo método de classe outra sendo função independente
Oiii João.
É exatamente isso, na prática, ambos vão geram rotas que executam funções/métodos correspondentes no final. Onde @action() cria rotas usando métodos de classes e @api_view() utiliza funções independentes.
Espero ter lhe ajudado.
Abraços e bons estudos!