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
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 :-)
Komentar yang paling membantu
Hai @zhangqunshi , sepertinya Anda menggunakan pra rilis 2.0.0.dev1. Anda benar,
name
telah menjadifield_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?