Me encontré con el problema de que el filtro booleano creado por django_filters.BooleanFilter espera diferentes parámetros de consulta con el filtro booleano heredado del modelo.
El filtro booleano heredado del modelo espera que el parámetro sea verdadero o falso, un filtro creado por BooleanFilter espera que los parámetros sean:
1 - traducido a "no establecido"
2 - traducido a "Verdadero"
3 - traducido a "Falso"
Este comportamiento hace que no quede claro cómo procesar los filtros personalizados de rest api desde el lado de javascript.
Código de ejemplo:
modelos.py:
class TestModel(models.Model):
first = models.BooleanField()
last = models.BooleanField()
api.py
`importar Django_filters
desde rest_framework importar conjuntos de vistas, serializadores
desde .models importar TestModel
clase TestFilter(django_filters.rest_framework.FilterSet):
primero_y_último = django_filters.BooleanFilter(método='primer_y_último_filtro')
def first_and_last_filter(self, conjunto de consultas, nombre, valor):
si valor==Verdadero:
return queryset.filter(primero=Verdadero, último=Verdadero);
conjunto de consulta de retorno;
metaclase:
modelo = modelo de prueba
campos = ['primero', 'último', 'primero_y_último']
clase TestSerializer(serializadores.ModelSerializer):
metaclase:
modelo = modelo de prueba
campos = ['primero', 'último']
clase TestViewSet(conjuntos de vistas.ModelViewSet):
modelo = modelo de prueba
conjunto de consultas = Modelo de prueba.objetos.todos()
serializer_class = TestSerializador
filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
filter_fields = ('primero', 'último', 'primero_y_último', )
filter_class = TestFilter`
El filtro del conjunto de vistas de prueba aquí espera que el parámetro de consulta sea "verdadero" o "falso" para los campos "primero" y "último", pero espera que sea 1, 2 o 3 para el campo de filtro "primero_y_último".
Por ejemplo, filtrar la consulta en frío sería así:
/api/test/?first=true&first_and_last=2
Este es un ejemplo simplificado en el proyecto real que encontré, el filtro personalizado contiene una lógica más complicada.
Configuré el repositorio con todo el código necesario para reproducir el problema.
https://github.com/inakrin/boolfilter
Hola @inakrin. Debe importar filters
del rest_framework
.
https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py
Por lo tanto, probablemente debería mencionarse en la documentación de DRF porque sugieren importar desde filtros:
http://www.django-rest-framework.org/api-guide/filtering/#specifying -a-filterset
Y por supuesto funciona en todos los casos excepto en BooleanFilter.
Comentario más útil
Hola @inakrin. Debe importar
filters
delrest_framework
.https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py