Django-filter: Comparaison des problèmes IsoDateTimeFilter autre que "exact"

Créé le 14 sept. 2017  ·  3Commentaires  ·  Source: carltongibson/django-filter

J'ai essayé d'implémenter le filtrage décrit ici : http://django-filter.readthedocs.io/en/develop/ref/filters.html#isodatetimefilter

Bien que cette méthode fonctionne, je voulais plus qu'une simple correspondance "exacte", j'ai donc remplacé :
fields = ['published']
avec:
fields = {'published': ['exact', 'gte', 'lte']}
Cela fonctionne toujours pour le filtrage 'exact' avec un IsoDateTime, mais pour 'gte' et 'lte', cela échoue lors de l'utilisation d'un IsoDateTime. Cela fonctionne lors de l'utilisation d'un DateTime.

J'utilise actuellement une solution de contournement qui fonctionne avec IsoDateTime en spécifiant chaque recherche séparément:

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')

Commentaire le plus utile

Vous pouvez utiliser Meta.filter_overrides pour modifier la classe de filtre utilisée pour un champ de modèle.

class BookFilter(django_filters.FilterSet):

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

Tous les 3 commentaires

Hmmm. Ma première réponse consiste simplement à accepter cela comme une limitation de la syntaxe fields du dictionnaire. Déclarer explicitement les champs - votre "solution de contournement" - est la manière canonique de le faire. La syntaxe du dictionnaire n'est qu'un raccourci, et il n'y a aucun problème avec ses limitations.

Cela dit, je prendrais un changement avec une petite empreinte pour "réparer" cela...

Vous pouvez utiliser Meta.filter_overrides pour modifier la classe de filtre utilisée pour un champ de modèle.

class BookFilter(django_filters.FilterSet):

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

@carltongibson Je suis content d'accepter la limitation. J'ai essayé de chercher une "solution" rapide mais ma compréhension du fonctionnement interne du code est trop limitée pour le moment :/

@rpkilby Merci, votre suggestion fonctionne bien, je l'utiliserai à l'avenir :)

@carltongibson Souhaitez-vous noter cette limitation dans la documentation ? Je suis heureux de faire une demande de tirage si vous pensez que c'est approprié.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

Sonictherocketman picture Sonictherocketman  ·  3Commentaires

csarcom picture csarcom  ·  3Commentaires

GuillaumeCisco picture GuillaumeCisco  ·  3Commentaires

edmorley picture edmorley  ·  3Commentaires

jwineinger picture jwineinger  ·  3Commentaires