J'utilise l'exemple de la doc :
release_year__gt = django_filters.NumberFilter(name='release_date', lookup_expr='year__gt')
mais j'ai l'erreur :
TypeError: __init__() got an unexpected keyword argument 'name'
quand je recherche le code, j'ai trouvé que le 'nom' a changé en 'field_name', le doc est ancien, non ??
J'utilise aussi le code :
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = ['file_name', ]
ci-dessus est ok, mais quand j'utilise le code:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name' : ['icontains'] }
Ce n'est pas du travail. la requête sql n'a pas d'instruction like %somevalue%
, pourquoi ?
Merci,
Kris
Salut @zhangqunshi , il semble que vous utilisiez la pré-version 2.0.0.dev1. Vous avez raison, name
est devenu field_name
. Les documents n'ont pas été mis à jour pour refléter cela (ce qui fait partie de la raison pour laquelle il s'agit d'une pré-version).
Il n'est pas facile de déboguer FileEvent
sans voir le modèle réel. Que se passe-t-il lorsque vous exécutez la requête suivante ?
FileEvent.objects.filter(file_name__icontains='foo')
FileEvent est simple, n'a que report_id, file_name et event_time. quand j'utilise :
FileEvent.objects.filter(file_name__icontains='foo')
Il deviendra le sql :
select * from file_event where file_name like '%foo%'
Pour le code :
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = ['file_name', ]
il deviendra le sql :
select * from file_event where file_name ='foo'
Pour le code :
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name' : ['icontains'] }
il deviendra le sql :
select * from file_event
BTW, le code pour obtenir le jeu de requêtes est :
filter = MyFilter(request.GET,
queryset=FileEvent.objects.values().filter(report_id=1).order_by(
'-event_time'))
print(filter.qs)
Et je ne trouve aucune aide de la doc, comment obtenir le résultat du filtre dans une vue commune, alors je recherche le code et trouve le champ 'qs' dans BaseFilterSet, et cela fonctionne.
Maintenant je change le code en :
class MyFilter(django_filters.FilterSet):
file_name = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = FileEvent
fields = ['file_name',]
et ça marche, le sql est like '%foo%'
@zhangqunshi , je suppose que vous filtrez avec une chaîne de requête incorrecte. Ça devrait être:
/file-events?file_name__icontains=foo
Tu as raison, j'utilise l'url : /file-events?file_name=foo
Parce que je pense que le code est déjà défini, le champ file_name doit utiliser les icontains.
Ouais. C'est contre-intuitif au début, mais le changement est nécessaire car vous pouvez utiliser la syntaxe du dictionnaire pour définir plusieurs filtres. Par exemple,
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name': ['icontains', 'istartswith', 'iendswith',]}
Cela vous permet d'exécuter des requêtes comme /file-events?file_name__istarswith=foo&file_name__iendswith=log
ok, je l'ai compris, et le code ['icontains', 'istartswith', 'iendswith',]
n'est qu'une liste de types de requêtes pris en charge. Si la requête n'utilise aucun élément de la liste, django-filter l'ignorera.
Merci beaucoup :-)
Commentaire le plus utile
Salut @zhangqunshi , il semble que vous utilisiez la pré-version 2.0.0.dev1. Vous avez raison,
name
est devenufield_name
. Les documents n'ont pas été mis à jour pour refléter cela (ce qui fait partie de la raison pour laquelle il s'agit d'une pré-version).Il n'est pas facile de déboguer
FileEvent
sans voir le modèle réel. Que se passe-t-il lorsque vous exécutez la requête suivante ?