Django-filter: Comparación de problemas de IsoDateTimeFilter que no sean 'exactos'

Creado en 14 sept. 2017  ·  3Comentarios  ·  Fuente: carltongibson/django-filter

He estado tratando de implementar el filtrado descrito aquí: http://django-filter.readthedocs.io/en/develop/ref/filters.html#isodatetimefilter

Si bien ese método funciona, quería algo más que una coincidencia 'exacta', así que reemplacé:
fields = ['published']
con:
fields = {'published': ['exact', 'gte', 'lte']}
Esto todavía funciona para el filtrado 'exacto' con un IsoDateTime, pero para 'gte' y 'lte', falla cuando se usa un IsoDateTime. Funciona cuando se usa un DateTime.

Estoy usando una solución alternativa en este momento que funciona con IsoDateTime especificando cada búsqueda por separado:

published = django_filters.IsoDateTimeFilter(
    name='published', lookup_expr='exact')
published_gte = django_filters.IsoDateTimeFilter(
    name='published', lookup_expr='gte')
published_lte = django_filters.IsoDateTimeFilter(
    name='published', lookup_expr='lte')

Comentario más útil

Puede usar Meta.filter_overrides para cambiar la clase de filtro utilizada para un campo de modelo.

class BookFilter(django_filters.FilterSet):

    class Meta:
        model = Book
        fields = {'published': ['exact', 'lte', 'gte']}
        filter_overrides = {
            models.DateTimeField: {'filter_class': django_filters.IsoDateTimeFilter},
        }

Todos 3 comentarios

Mmm. Mi primera respuesta es simplemente aceptar esto como una limitación de la sintaxis fields del diccionario. Declarar campos explícitamente, su "solución alternativa", es la forma canónica de hacerlo. La sintaxis del diccionario es solo un atajo, y no hay problema con que tenga limitaciones.

Habiendo dicho eso, tomaría un cambio con una huella pequeña para "arreglar" esto...

Puede usar Meta.filter_overrides para cambiar la clase de filtro utilizada para un campo de modelo.

class BookFilter(django_filters.FilterSet):

    class Meta:
        model = Book
        fields = {'published': ['exact', 'lte', 'gte']}
        filter_overrides = {
            models.DateTimeField: {'filter_class': django_filters.IsoDateTimeFilter},
        }

@carltongibson Estoy feliz de aceptar la limitación. Intenté buscar una "solución" rápida, pero mi comprensión del funcionamiento interno del código es demasiado limitada en este momento:/

@rpkilby Gracias, su sugerencia funciona bien, la usaré en el futuro :)

@carltongibson ¿Le gustaría tener en cuenta esta limitación en los documentos? Me complace hacer una solicitud de incorporación de cambios si cree que es apropiado.

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