Django-filter: TypeError: __init__() hat ein unerwartetes Schlüsselwortargument 'name' erhalten

Erstellt am 4. Nov. 2017  ·  7Kommentare  ·  Quelle: carltongibson/django-filter

Ich verwende das Beispiel im Dokument:

release_year__gt = django_filters.NumberFilter(name='release_date', lookup_expr='year__gt')

aber ich habe den fehler:
TypeError: __init__() got an unexpected keyword argument 'name'

Wenn ich den Code nachschlage, habe ich festgestellt, dass sich der 'Name' in 'field_name' geändert hat, das Dokument ist alt, oder??

Außerdem verwende ich den Code:

class MyFilter(django_filters.FilterSet):
    class Meta:
        model = FileEvent
        fields = ['file_name', ]

oben ist in Ordnung, aber wenn ich den Code verwende:

class MyFilter(django_filters.FilterSet):
    class Meta:
        model = FileEvent
        fields = {'file_name' : ['icontains'] }

Es ist keine Arbeit. das quey sql hat keine Anweisung like %somevalue% , warum?

Vielen Dank,
Kris

Hilfreichster Kommentar

Hallo @zhangqunshi , es hört sich so an, als ob Sie die Vorabversion 2.0.0.dev1 verwenden. Sie haben Recht, aus name wurde field_name . Die Dokumentation wurde nicht aktualisiert, um dies widerzuspiegeln (was einer der Gründe ist, warum es sich um eine Vorabversion handelt).

Es ist nicht einfach, FileEvent zu debuggen, ohne das tatsächliche Modell zu sehen. Was passiert, wenn Sie die folgende Abfrage ausführen?

FileEvent.objects.filter(file_name__icontains='foo')

Alle 7 Kommentare

Hallo @zhangqunshi , es hört sich so an, als ob Sie die Vorabversion 2.0.0.dev1 verwenden. Sie haben Recht, aus name wurde field_name . Die Dokumentation wurde nicht aktualisiert, um dies widerzuspiegeln (was einer der Gründe ist, warum es sich um eine Vorabversion handelt).

Es ist nicht einfach, FileEvent zu debuggen, ohne das tatsächliche Modell zu sehen. Was passiert, wenn Sie die folgende Abfrage ausführen?

FileEvent.objects.filter(file_name__icontains='foo')

FileEvent ist einfach, hat nur report_id, file_name und event_time. wenn ich benutze:

FileEvent.objects.filter(file_name__icontains='foo')

Es wird das SQL:

select * from file_event where file_name like '%foo%'

Für den Code:

class MyFilter(django_filters.FilterSet):
    class Meta:
        model = FileEvent
        fields = ['file_name', ]

es wird das sql:

select * from file_event where file_name ='foo'

Für den Code:

class MyFilter(django_filters.FilterSet):
    class Meta:
        model = FileEvent
        fields = {'file_name' : ['icontains'] }

es wird das sql:

select * from file_event

Übrigens, der Code zum Abrufen des Abfragesatzes lautet:

    filter = MyFilter(request.GET,
                               queryset=FileEvent.objects.values().filter(report_id=1).order_by(
                                   '-event_time'))
   print(filter.qs)

Und ich kann keine Hilfe von doc finden, wie man Ergebnisse von Filtern in einer gemeinsamen Ansicht erhält, also suche ich den Code und finde das Feld 'qs'in BaseFilterSet, und es funktioniert.

Jetzt ändere ich den Code in:

class MyFilter(django_filters.FilterSet):
    file_name = django_filters.CharFilter(lookup_expr='icontains')

    class Meta:
        model = FileEvent
        fields = ['file_name',]

und es funktioniert, die sql ist like '%foo%'

@zhangqunshi , ich vermute, dass Sie mit einer falschen Abfragezeichenfolge filtern. Es sollte sein:

/file-events?file_name__icontains=foo

Du hast Recht, ich verwende die URL: /file-events?file_name=foo
Da ich denke, dass der Code bereits definiert ist, sollte das Feld file_name die Icontains verwenden.

Ja. Es ist zunächst nicht intuitiv, aber die Änderung ist notwendig, da Sie die Wörterbuchsyntax verwenden können, um mehrere Filter zu definieren. Zum Beispiel,

class MyFilter(django_filters.FilterSet):
    class Meta:
        model = FileEvent
        fields = {'file_name': ['icontains', 'istartswith', 'iendswith',]}

Auf diese Weise können Sie Abfragen wie /file-events?file_name__istarswith=foo&file_name__iendswith=log ausführen

Ok, ich habe es verstanden und der Code ['icontains', 'istartswith', 'iendswith',] ist nur eine Liste unterstützter Abfragetypen. Wenn die Abfrage kein Element der Liste verwendet, wird es von django-filter ignoriert.

Danke vielmals :-)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen