3
respostas

Qual a diferença entre @action e @api_view no DRF?

Quando que devo usar um ou outro?

3 respostas

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!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. 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!