Quando que devo usar um ou outro?
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!