1
resposta

ListAPIView com get_queryset chamando duas vezes

Utilizando ListAPIView com get_queryset percebi que a chamada é executada duas vezes tem alguma forma de evitar esse. Estou tentando realizar uma chamada de api no fluxo

1 resposta

Olá, Leandro.

Tudo bem?

Esse comportamento pode ocorrer devido a diversas razões, como middleware ou mixins adicionais que você pode estar usando. Aqui estão algumas dicas que podem ajudar a mitigar esse problema:

  • Verifique Middleware e Mixins: Certifique-se de que não há middleware ou mixins adicionais que possam estar interferindo na execução da sua view.

  • Override do Método list: Uma abordagem é sobrescrever o método list da sua ListAPIView, assim você pode controlar melhor quando o queryset é chamado.

    from rest_framework.response import Response
    
    class ListaMatriculasAluno(generics.ListAPIView):
        """Listando as matrículas de um aluno ou aluna"""
        serializer_class = ListaMatriculasAlunoSerializer
    
        def get_queryset(self):
            queryset = Matricula.objects.filter(aluno_id=self.kwargs['pk'])
            return queryset
    
        def list(self, request, *args, **kwargs):
            queryset = self.get_queryset()
            serializer = self.get_serializer(queryset, many=True)
            return Response(serializer.data)
    
  • Cache do Queryset: Outra técnica é armazenar o queryset em uma variável de instância para evitar múltiplas chamadas.

    class ListaMatriculasAluno(generics.ListAPIView):
        """Listando as matrículas de um aluno ou aluna"""
        serializer_class = ListaMatriculasAlunoSerializer
        _queryset = None
    
        def get_queryset(self):
            if self._queryset is None:
                self._queryset = Matricula.objects.filter(aluno_id=self.kwargs['pk'])
            return self._queryset
    

Essas abordagens devem ajudar a evitar chamadas duplicadas ao get_queryset. Teste cada uma delas para ver qual se adapta melhor ao seu caso.

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.