Django-filter: Die DRF-Integration funktioniert nicht für zusätzliche Viewset-Aktionen

Erstellt am 16. Aug. 2018  ·  9Kommentare  ·  Quelle: carltongibson/django-filter

Ich habe mehrere Listenaktionen in einem einzigen Viewset, indem ich den @action- Decorator wie hier beschrieben verwende und ein FilterSet über filter_class wie in den Dokumenten hier angegeben eingefügt habe. Die Filter werden nur auf die standardmäßigen Listen- und Abrufaktionen von ViewSet angewendet und nicht auf die benutzerdefinierten Listen- oder Abrufaktionen, für die wir die Filter tatsächlich benötigen.

Hilfreichster Kommentar

Ich habe es zum Laufen gebracht, indem ich den Anruf einfach wie folgt verschoben habe

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

Danke für die Hilfe!!!

Alle 9 Kommentare

Hallo @estianross. Sie müssen mehr Details angeben, wenn wir in der Lage sein werden, einen Kommentar abzugeben.

Sind Sie sicher, dass Ihre zusätzlichen Aktionen filter_queryset() aufrufen?

Sie tun es, aber ich bin mir ziemlich sicher, dass ich es nicht so verwende, wie es verwendet werden sollte, wenn das Problem darin liegt. Ich habe unten eine einfache Beispielaktion eingefügt, um die Grundlagen dessen zu zeigen, was ich bei diesen Aktionen mache

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

Ich schlage vor, dass Sie einen APITestCase erstellen und die URL + Abfrageparameter, die Sie erwarten, darin einfügen. Sie können dann nach Bedarf Behauptungen aufstellen und Haltepunkte einfügen, um zu sehen, wo für Sie etwas schief läuft.

(Ich fürchte, ohne viel mehr Details ist es unmöglich, überhaupt Ratschläge zu geben.)

Ich habe es zum Laufen gebracht, indem ich den Anruf einfach wie folgt verschoben habe

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

Danke für die Hilfe!!!

Dies scheint in den meisten meiner Fälle nicht zu funktionieren.

Ich denke, dieses Thema sollte wieder aufgegriffen werden. Ich habe das gleiche Problem und die vorgeschlagene Lösung hat bei mir funktioniert.

@action(methods=['get'], detail=True, url_path='retrieve_by_card_no/(< int:CardNo> )')
def getByCarNo(selbst, Anfrage, CardNo):
user = get_object_or_404(employe_model, EmpCardNo=CardNo)
Antwort zurückgeben (Serializers.EmployeeInfoSerializer(Benutzer).Daten, Status=Status.HTTP_200_OK)

Ich möchte den Mitarbeiter anhand seiner Kartennummer anstelle der Mitarbeiter-ID suchen

wer kann mir helfen?

Ich denke, die Filterintegration funktioniert korrekt, wenn Sie die Abfrageparameter zusammen mit Ihrer Aktion in der URL übergeben. Unten war die Aktion, die ich hatte

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

Beim Versuch, die Exportaktion von der durchsuchbaren DRF-API aufzurufen, wurde die Anforderung gesendet
/api/viewname/export/ stattdessen sollte es wie heißen
/api/viewname/export/?query_param_1=value1&?query_param_2=value2

Wenn Sie die Abfrageparameter zusammen mit der Aktion übergeben, wird die Filterset-Klasse aufgerufen, und Sie erhalten daher ein gefiltertes Abfrageset in der Variable „filtered_queryset“.

Vielen Dank, ich habe es herausgefunden

Am Mi, 28. April 2021 um 00:32 Uhr Mohammed Sunasra @ . * >
schrieb:

Ich denke, die Filterintegration funktioniert korrekt, wenn Sie die Abfrage übergeben
params zusammen mit Ihrer Aktion in der URL. Unten war die Aktion, die ich hatte

@action(methods=['GET'], detail=False)
def export(selbst, anfordern):
queryset = self.get_queryset()
gefilterter_Abfragesatz = self.filter_queryset(Abfragesatz)

Beim Versuch, die Exportaktion von der durchsuchbaren DRF-API aufzurufen, wird die Anfrage
das war immer gesendet wurde
/api/viewname/export/ stattdessen sollte es wie heißen
/api/viewname/export/?query_param_1=value1&?query_param_2=value2

Wenn Sie die Abfrageparameter zusammen mit der Aktion übergeben, wird das Filterset aufgerufen
Klasse und daher erhalten Sie ein gefiltertes Abfrageset in filtered_queryset
Variable


Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/carltongibson/django-filter/issues/967#issuecomment-828220562 ,
oder abbestellen
https://github.com/notifications/unsubscribe-auth/AMD2QQXC6FGISRWTHRAGUSTTK62Y7ANCNFSM4FP6FMMQ
.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen