Eu tenho várias ações de lista em um único conjunto de visualizações usando o decorador @action conforme descrito aqui e incluí um FilterSet via filter_class conforme especificado nos documentos aqui . Os filtros estão sendo aplicados apenas às ações padrão ViewSet List e Retrieve e não a nenhuma das ações personalizadas List ou Retrieve, que é onde realmente precisamos dos filtros.
Olá @estianross. Você precisa fornecer mais detalhes para podermos comentar.
Tem certeza de que suas ações extras estão chamando filter_queryset()
?
Eles fazem, mas tenho certeza de que não estou usando da maneira que deveria ser usado se é onde está o problema, incluí uma ação de exemplo simples abaixo para mostrar o básico do que estou fazendo nessas ações
@action(methods=['GET'], detail=False)
def simplelist(self, request, *args, **kwargs):
serializer = SpecializedModelListSerializer(self.filter_queryset(self.get_queryset()), many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
Eu sugiro que você crie um APITestCase e conecte os parâmetros url + query que você espera nele. Você poderá então fazer asserções e inserir pontos de interrupção conforme necessário para ver onde as coisas estão dando errado para você.
(Temo que, sem muito mais detalhes, seja impossível aconselhar.)
Eu consegui funcionar simplesmente movendo a chamada da seguinte maneira
@action(methods=['GET'], detail=False)
def simplelist(self, request, *args, **kwargs):
qs = self.filter_queryset(self.get_queryset())
serializer = SpecializedModelListSerializer(qs, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
Obrigado pela ajuda!!!
Isso não parece funcionar na maioria dos meus casos.
Acho que esse assunto deveria ser reaberto. Eu tenho o mesmo problema e a solução proposta funcionou para mim.
@action(methods=['get'], detail=True, url_path='retrieve_by_card_no/(< int:CardNo> )')
def getByCarNo(self, request, CardNo):
usuário = get_object_or_404(employe_model, EmpCardNo=CardNo)
return Response(serializers.EmployeeInfoSerializer(user).data, status=status.HTTP_200_OK)
Quero pesquisar o funcionário pelo cartão dele não em vez do ID do funcionário
Alguém pode me ajudar?
Acho que a integração do filtro funciona corretamente se você passar os parâmetros de consulta junto com sua ação na URL. Abaixo estava a ação que eu tinha
@action(methods=['GET'], detail=False)
def export(self, request):
queryset = self.get_queryset()
filtered_queryset = self.filter_queryset(queryset)
Ao tentar chamar a ação de exportação da API navegável do DRF, a solicitação que estava sendo enviada era
/api/viewname/export/ em vez disso, deve ser chamado como
/api/viewname/export/?query_param_1=value1&?query_param_2=value2
Passar os parâmetros de consulta junto com a ação chamará a classe do conjunto de filtros e, portanto, você obterá um conjunto de consultas filtrado na variável filter_queryset
Muito obrigado eu percebi
Quarta-feira, 28 de abril de 2021 às 12h32 Mohammed Sunasra @ . * >
escreveu:
Acho que a integração do filtro funciona corretamente se você passar a consulta
params junto com sua ação no URL. Abaixo estava a ação que eu tinha@action(methods=['GET'], detail=False)
def export(self, request):
queryset = self.get_queryset()
filter_queryset = self.filter_queryset(queryset)Ao tentar chamar a ação de exportação da API navegável por DRF, a solicitação
que estava sendo enviado era
/api/viewname/export/ em vez disso, deve ser chamado como
/api/viewname/export/?query_param_1=value1&?query_param_2=value2Passar os parâmetros de consulta junto com a ação chamará o conjunto de filtros
class e, portanto, você obterá um queryset filtrado em filter_queryset
variável—
Você está recebendo isso porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/carltongibson/django-filter/issues/967#issuecomment-828220562 ,
ou cancelar
https://github.com/notifications/unsubscribe-auth/AMD2QQXC6FGISRWTHRAGUSTTK62Y7ANCNFSM4FP6FMMQ
.
Comentários muito úteis
Eu consegui funcionar simplesmente movendo a chamada da seguinte maneira
Obrigado pela ajuda!!!