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
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.
Hilfreichster Kommentar
Hallo @inakrin. Sie sollten
filters
aus demrest_framework
importieren.https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py