Django-filter: TypeError: __init__() mendapat 'nama' argumen kata kunci yang tidak terduga

Dibuat pada 4 Nov 2017  ·  7Komentar  ·  Sumber: carltongibson/django-filter

Saya menggunakan contoh di dokumen:

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

tapi saya mendapatkan kesalahan:
TypeError: __init__() got an unexpected keyword argument 'name'

ketika saya mencari kode, saya menemukan 'nama' telah berubah menjadi 'field_name', doc sudah tua, kan??

Saya juga menggunakan kode:

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

di atas ok, tetapi ketika saya menggunakan kode:

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

Ini bukan pekerjaan. quey sql tidak memiliki pernyataan like %somevalue% , mengapa?

Terima kasih,
Keris

Komentar yang paling membantu

Hai @zhangqunshi , sepertinya Anda menggunakan pra rilis 2.0.0.dev1. Anda benar, name telah menjadi field_name . Dokumen belum diperbarui untuk mencerminkan hal ini (yang merupakan bagian dari alasan mengapa ini adalah pra-rilis).

Tidak mudah untuk men-debug FileEvent tanpa melihat model sebenarnya. Apa yang terjadi ketika Anda menjalankan kueri berikut?

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

Semua 7 komentar

Hai @zhangqunshi , sepertinya Anda menggunakan pra rilis 2.0.0.dev1. Anda benar, name telah menjadi field_name . Dokumen belum diperbarui untuk mencerminkan hal ini (yang merupakan bagian dari alasan mengapa ini adalah pra-rilis).

Tidak mudah untuk men-debug FileEvent tanpa melihat model sebenarnya. Apa yang terjadi ketika Anda menjalankan kueri berikut?

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

FileEvent sederhana, hanya memiliki report_id, file_name dan event_time. ketika saya menggunakan:

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

Ini akan menjadi sql:

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

Untuk kode:

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

itu akan menjadi sql:

select * from file_event where file_name ='foo'

Untuk kode:

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

itu akan menjadi sql:

select * from file_event

BTW kode untuk mendapatkan queryset adalah:

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

Dan saya tidak dapat menemukan bantuan dari doc, bahwa cara mendapatkan hasil dari filter dalam tampilan umum, jadi saya mencari kode, dan menemukan bidang 'qs' di BaseFilterSet, dan itu berfungsi.

Sekarang saya mengubah kode menjadi:

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

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

dan berhasil, sqlnya adalah like '%foo%'

@zhangqunshi , tebakan saya adalah Anda memfilter dengan

/file-events?file_name__icontains=foo

Anda benar, saya menggunakan url: /file-events?file_name=foo
Karena menurut saya kode tersebut sudah mendefinisikan bidang file_name harus menggunakan icontains.

Ya. Ini berlawanan dengan intuisi pada awalnya, tetapi perubahan diperlukan karena Anda dapat menggunakan sintaks kamus untuk menentukan beberapa filter. Sebagai contoh,

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

Ini memungkinkan Anda menjalankan kueri seperti /file-events?file_name__istarswith=foo&file_name__iendswith=log

ok, saya mengerti, dan kode ['icontains', 'istartswith', 'iendswith',] hanyalah daftar jenis kueri yang didukung. Jika kueri tidak menggunakan item apa pun dari daftar, django-filter akan mengabaikannya.

Terima kasih banyak :-)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat