Django-filter: L'intégration DRF ne fonctionne pas pour les actions de vues supplémentaires

Créé le 16 août 2018  ·  9Commentaires  ·  Source: carltongibson/django-filter

J'ai plusieurs actions de liste dans un seul ensemble de vues en utilisant le décorateur @action comme décrit ici et j'ai inclus un FilterSet via filter_class comme spécifié dans la documentation ici . Les filtres ne sont appliqués qu'aux actions ViewSet List et Retrieve par défaut et à aucune des actions List ou Retrieve personnalisées, là où nous avons réellement besoin des filtres.

Commentaire le plus utile

Je l'ai fait fonctionner en déplaçant simplement l'appel comme suit

@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)

Merci pour l'aide!!!

Tous les 9 commentaires

Salut @estianross. Vous devez fournir plus de détails si nous voulons être en mesure de commenter.

Êtes-vous sûr que vos actions supplémentaires appellent filter_queryset() ?

Ils le font, mais je suis à peu près sûr que je ne l'utilise pas comme il se doit si c'est là que se situe le problème, j'ai inclus un exemple d'action simple ci-dessous pour montrer les bases de ce que je fais dans ces actions

@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)

Je vous suggère de créer un APITestCase et d'y brancher les paramètres url + query que vous attendez. Vous pourrez ensuite faire des assertions et insérer des points d'arrêt au besoin pour voir où les choses ne vont pas pour vous.

(Je crains que sans beaucoup plus de détails, il soit impossible de pouvoir conseiller du tout.)

Je l'ai fait fonctionner en déplaçant simplement l'appel comme suit

@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)

Merci pour l'aide!!!

Cela ne semble pas fonctionner dans la plupart de mes cas.

Je pense que ce sujet devrait être rouvert. J'ai le même problème et la solution proposée a fonctionné pour moi.

@action(methods=['get'], detail=True, url_path='retrieve_by_card_no/(< int:CardNo> )')
def getByCarNo(self, request, CardNo):
user = get_object_or_404(employe_model, EmpCardNo=CardNo)
retourner la réponse (serializers.EmployeeInfoSerializer(user).data, status=status.HTTP_200_OK)

Je veux rechercher un employé par son numéro de carte au lieu de son identifiant d'employé

Est-ce que quelqu'un peut m'aider?

Je pense que l'intégration du filtre fonctionne correctement si vous transmettez les paramètres de requête avec votre action dans l'URL. Ci-dessous était l'action que j'avais

@action(methods=['GET'], detail=False)
def export(self, request): 
    queryset = self.get_queryset()
    filtered_queryset = self.filter_queryset(queryset)

Lors de la tentative d'appel de l'action d'exportation à partir de l'API navigable DRF, la demande envoyée était
/api/viewname/export/ à la place, il devrait être appelé comme
/api/viewname/export/?query_param_1=value1&?query_param_2=value2

Passer les paramètres de requête avec l'action appellera la classe filterset et vous obtiendrez donc un jeu de requêtes filtré dans la variable filtered_queryset

Merci beaucoup j'ai compris

Le mer. 28 avril 2021 à 00h32 Mohammed Sunasra @ . * >
a écrit:

Je pense que l'intégration du filtre fonctionne correctement si vous passez la requête
params avec votre action dans l'URL. Ci-dessous était l'action que j'avais

@action(methods=['GET'], detail=False)
def export(self, request):
jeu de requêtes = self.get_queryset()
filtered_queryset = self.filter_queryset(queryset)

Lorsque vous essayez d'appeler l'action d'exportation à partir de l'API navigable DRF, la demande
qui était envoyé était
/api/viewname/export/ à la place, il devrait être appelé comme
/api/viewname/export/?query_param_1=value1&?query_param_2=value2

Passer les paramètres de requête avec l'action appellera le jeu de filtres
class et donc vous obtiendrez un jeu de requêtes filtré dans filtered_queryset
variable


Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/carltongibson/django-filter/issues/967#issuecomment-828220562 ,
ou désabonnez-vous
https://github.com/notifications/unsubscribe-auth/AMD2QQXC6FGISRWTHRAGUSTTK62Y7ANCNFSM4FP6FMMQ
.

Cette page vous a été utile?
0 / 5 - 0 notes