Django-filter: Der django_filters.BooleanFilter mit Methode und ein von einem Modell geerbter boolescher Filter funktionieren nicht auf die gleiche Weise.

Erstellt am 24. Apr. 2017  ·  3Kommentare  ·  Quelle: carltongibson/django-filter

Ich bin auf ein Problem gestoßen, bei dem der von django_filters.BooleanFilter erstellte boolesche Filter unterschiedliche Abfrageparameter mit dem vom Modell geerbten booleschen Filter erwartet.
Vom Modell geerbte boolesche Filter erwarten, dass der Parameter wahr oder falsch ist, ein von BooleanFilter erstellter Filter erwartet, dass die Parameter entweder:
1 - übersetzt in "nicht gesetzt"
2 - übersetzt in "Wahr"
3 - übersetzt in "Falsch"
Dieses Verhalten macht es unklar, wie benutzerdefinierte Rest-API-Filter von der Javascript-Seite verarbeitet werden.

Beispielcode:

Modelle.py:
class TestModel(models.Model): first = models.BooleanField() last = models.BooleanField()
api.py

`importiere django_filters
aus rest_framework importiere Viewsets, Serialisierer
aus .models importiere TestModel

Klasse TestFilter(django_filters.rest_framework.FilterSet):
first_and_last = django_filters.BooleanFilter(method='first_and_last_filter')
def first_and_last_filter(self, queryset, name, value):
wenn Wert==Wahr:
return queryset.filter (first=True, last=True);
Abfragesatz zurückgeben;
Klasse Meta:
Modell = Testmodell
Felder = ['first', 'last', 'first_and_last']

Klasse TestSerializer(Serializers.ModelSerializer):
Klasse Meta:
Modell = Testmodell
Felder = ['erster', 'letzter']

Klasse TestViewSet(viewsets.ModelViewSet):
Modell = Testmodell
queryset = TestModel.objects.all()
serializer_class = TestSerializer
filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
filter_fields = ('first', 'last', 'first_and_last', )
filter_class = TestFilter`

Der Test-Viewset-Filter erwartet hier, dass der Abfrageparameter für die Felder „first“ und „last“ „true“ oder „false“ ist, aber erwartet, dass er 1,2 oder 3 für das Filterfeld „first_and_last“ ist.
Zum Beispiel kann das Filtern der Abfrage so aussehen:
/api/test/?first=true&first_and_last=2

Dies ist ein vereinfachtes Beispiel in dem realen Projekt, auf das ich gestoßen bin. Der benutzerdefinierte Filter enthält eine kompliziertere Logik.
Ich habe das Repo mit dem gesamten Code eingerichtet, der zum Reproduzieren des Problems erforderlich ist.
https://github.com/inakrin/boolfilter

Hilfreichster Kommentar

Hallo @inakrin. Sie sollten filters aus dem rest_framework importieren.

https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py

Alle 3 Kommentare

Hallo @inakrin. Sie sollten filters aus dem rest_framework importieren.

https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py

Daher sollte es wahrscheinlich in der DRF-Dokumentation erwähnt werden, da sie den Import aus Filtern vorschlagen:
http://www.django-rest-framework.org/api-guide/filtering/#specifying -a-filterset
Und es funktioniert natürlich in allen Fällen außer BooleanFilter.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen