Utilizo el ejemplo en el documento:
release_year__gt = django_filters.NumberFilter(name='release_date', lookup_expr='year__gt')
pero tengo el error:
TypeError: __init__() got an unexpected keyword argument 'name'
cuando busco el código, encontré que el 'nombre' ha cambiado a 'field_name', el documento es antiguo, ¿verdad?
También uso el código:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = ['file_name', ]
arriba está bien, pero cuando uso el código:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name' : ['icontains'] }
No es trabajo. el sql quey no tiene declaración like %somevalue%
, ¿por qué?
Gracias,
Kris
Hola @zhangqunshi , parece que estás usando la versión preliminar 2.0.0.dev1. Tienes razón, name
ha convertido en field_name
. Los documentos no se han actualizado para reflejar esto (que es parte de la razón por la que es una versión preliminar).
No es fácil depurar FileEvent
sin ver el modelo real. ¿Qué sucede cuando ejecuta la siguiente consulta?
FileEvent.objects.filter(file_name__icontains='foo')
FileEvent es simple, solo tiene report_id, file_name y event_time. cuando uso:
FileEvent.objects.filter(file_name__icontains='foo')
Se convertirá en el sql:
select * from file_event where file_name like '%foo%'
Para el código:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = ['file_name', ]
se convertirá en el sql:
select * from file_event where file_name ='foo'
Para el código:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name' : ['icontains'] }
se convertirá en el sql:
select * from file_event
Por cierto, el código para obtener el conjunto de consultas es:
filter = MyFilter(request.GET,
queryset=FileEvent.objects.values().filter(report_id=1).order_by(
'-event_time'))
print(filter.qs)
Y no puedo encontrar ninguna ayuda de doc, sobre cómo obtener el resultado del filtro en una vista común, así que busco el código y encuentro el campo 'qs' en BaseFilterSet, y funciona.
Ahora cambio el código a:
class MyFilter(django_filters.FilterSet):
file_name = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = FileEvent
fields = ['file_name',]
y funciona, el sql es like '%foo%'
@zhangqunshi , supongo que estás filtrando con una cadena de consulta incorrecta. Debería ser:
/file-events?file_name__icontains=foo
Tienes razón, uso la URL: /file-events?file_name=foo
Porque creo que el código ya está definido, el campo file_name debería usar los icontains.
Sí. Es contradictorio al principio, pero el cambio es necesario porque puede usar la sintaxis del diccionario para definir varios filtros. Por ejemplo,
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name': ['icontains', 'istartswith', 'iendswith',]}
Esto le permite ejecutar consultas como /file-events?file_name__istarswith=foo&file_name__iendswith=log
ok, lo tengo, y el código ['icontains', 'istartswith', 'iendswith',]
es solo una lista de tipos de consulta admitidos. Si la consulta no usa ningún elemento de la lista, django-filter lo ignorará.
Muchas gracias :-)
Comentario más útil
Hola @zhangqunshi , parece que estás usando la versión preliminar 2.0.0.dev1. Tienes razón,
name
ha convertido enfield_name
. Los documentos no se han actualizado para reflejar esto (que es parte de la razón por la que es una versión preliminar).No es fácil depurar
FileEvent
sin ver el modelo real. ¿Qué sucede cuando ejecuta la siguiente consulta?