Django-filter: A integração DRF não funciona para ações extras de viewset

Criado em 16 ago. 2018  ·  9Comentários  ·  Fonte: carltongibson/django-filter

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.

Comentários muito úteis

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!!!

Todos 9 comentários

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=value2

Passar 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
.

Esta página foi útil?
0 / 5 - 0 avaliações