Django-filter: TypeError: __init __ () obtuvo un argumento de palabra clave inesperado 'nombre'

Creado en 4 nov. 2017  ·  7Comentarios  ·  Fuente: carltongibson/django-filter

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

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

Todos 7 comentarios

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

¿Fue útil esta página
0 / 5 - 0 calificaciones