1
resposta

Location nas viewsets do Django Rest API

Boa noite!

Na aula, o professor deu como exemplo o seguinte código, para auto-documentar por exemplo a criação de um aluno:

class AlunosViewSet(viewsets.ModelViewSet):
    """Exibindo todos os alunos e alunas"""
    queryset = Aluno.objects.all()
    authentication_classes = [BasicAuthentication]
    permission_classes = [IsAuthenticated, DjangoModelPermissions]

    def create(self, request):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            serializer.save()
            response = Response(serializer.data, status=status.HTTP_201_CREATED)
            id = str(serializer.data['id'])
            response['Location'] = request.build_absolute_uri() + id
            return response

Gostaria de saber como seria para os demais métodos caso eu queira implementar todos os verbos / o crud completo.

No caso quais seriam os métodos para sobrescrever (create, patch, put, delete, post)? E quais seriam as diferenças no código? Bastaria mudar o status no response pra cada situação (ex: create com status 201_created.. como ficaria pros outros http method names)?

Obrigado!

1 resposta

Olá André, tudo bem com você?

Peço desculpas pela demora em obter um retorno.

Para implementar o CRUD completo em uma ViewSet do Django Rest Framework, você pode sobrescrever os métodos create, retrieve, update, partial_update e destroy.

Podemos seguir a lógica do método create para a criação dos demais métodos, alterando o status de retorno conforme a ação realizada. Por exemplo, no método retrieve, podemos utilizar o status HTTP_200_OK para indicar que a operação foi realizada com sucesso.

Segue um exemplo de como ficaria o código para implementar todos os métodos:

class AlunosViewSet(viewsets.ModelViewSet):
    """Exibindo todos os alunos e alunas"""
    queryset = Aluno.objects.all()
    authentication_classes = [BasicAuthentication]
    permission_classes = [IsAuthenticated, DjangoModelPermissions]

    def create(self, request):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            serializer.save()
            response = Response(serializer.data, status=status.HTTP_201_CREATED)
            id = str(serializer.data['id'])
            response['Location'] = request.build_absolute_uri() + id
            return response
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def retrieve(self, request, pk=None):
        aluno = get_object_or_404(self.queryset, pk=pk)
        serializer = self.serializer_class(aluno)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def update(self, request, pk=None):
        aluno = get_object_or_404(self.queryset, pk=pk)
        serializer = self.serializer_class(aluno, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def partial_update(self, request, pk=None):
        aluno = get_object_or_404(self.queryset, pk=pk)
        serializer = self.serializer_class(aluno, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def destroy(self, request, pk=None):
        aluno = get_object_or_404(self.queryset, pk=pk)
        aluno.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

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!