Django-filter: El método django_filters.BooleanFilter with y un filtro booleano heredado de un modelo no funcionan de la misma manera.

Creado en 24 abr. 2017  ·  3Comentarios  ·  Fuente: carltongibson/django-filter

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

Comentario más útil

Todos 3 comentarios

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.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

sassanh picture sassanh  ·  4Comentarios

loganknecht picture loganknecht  ·  4Comentarios

madelyneriksen picture madelyneriksen  ·  4Comentarios

GuillaumeCisco picture GuillaumeCisco  ·  3Comentarios

blueyed picture blueyed  ·  4Comentarios