Django-filter: Le django_filters.BooleanFilter avec méthode et un filtre booléen hérité d'un modèle ne fonctionnent pas de la même manière.

Créé le 24 avr. 2017  ·  3Commentaires  ·  Source: carltongibson/django-filter

J'ai rencontré un problème selon lequel le filtre booléen créé par django_filters.BooleanFilter attend différents paramètres de requête avec le filtre booléen hérité du modèle.
Le filtre booléen hérité du modèle s'attend à ce que le paramètre soit vrai ou faux, un filtre créé par BooleanFilter s'attend à ce que les paramètres soient :
1 - traduit par "non défini"
2 - traduit par "Vrai"
3 - traduit par "Faux"
Ce comportement ne permet pas de savoir comment traiter les filtres personnalisés de l'api de repos du côté javascript.

Exemple de code :

modèles.py :
class TestModel(models.Model): first = models.BooleanField() last = models.BooleanField()
api.py

`importer django_filters
à partir de rest_framework importer des ensembles de vues, des sérialiseurs
à partir de .models importer TestModel

classe 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):
si valeur==Vrai :
return queryset.filter(first=True, last=True);
renvoie l'ensemble de requêtes ;
méta classe :
modèle = TestModèle
champs = ['premier', 'dernier', 'premier_et_dernier']

classe TestSerializer(serializers.ModelSerializer):
méta classe :
modèle = TestModèle
champs = ['premier', 'dernier']

classe TestViewSet(viewsets.ModelViewSet):
modèle = TestModèle
ensemble de requêtes = TestModel.objects.all()
serializer_class = TestSerializer
filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
filter_fields = ('first', 'last', 'first_and_last', )
classe_filtre = TestFiltre`

Ici, le filtre de l'ensemble de vues de test s'attend à ce que le paramètre de requête soit "true" ou "false" pour les champs "first" et "last", mais s'attend à ce qu'il soit 1,2 ou 3 pour le champ de filtre "first_and_last".
Par exemple, filtrer la requête à froid ressemble à ceci :
/api/test/?first=true&first_and_last=2

Ceci est un exemple simplifié dans le projet réel que j'ai rencontré, le filtre personnalisé contient une logique plus compliquée.
J'ai configuré le référentiel avec tout le code nécessaire pour reproduire le problème.
https://github.com/inakrin/boolfilter

Commentaire le plus utile

Salut @inakrin. Vous devez importer filters partir du sous-paquet rest_framework .

https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py

Tous les 3 commentaires

Salut @inakrin. Vous devez importer filters partir du sous-paquet rest_framework .

https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py

Donc, cela devrait probablement être mentionné dans la documentation DRF car ils suggèrent d'importer à partir de filtres :
http://www.django-rest-framework.org/api-guide/filtering/#specifying-a-filterset
Et cela fonctionne bien sûr dans tous les cas sauf BooleanFilter.

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