Django-filter: TypeError : __init__() a obtenu un argument de mot-clé inattendu 'nom'

Créé le 4 nov. 2017  ·  7Commentaires  ·  Source: carltongibson/django-filter

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

Commentaire le plus utile

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

Tous les 7 commentaires

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

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