Django-filter: TypeError: __init __ () obteve um argumento de palavra-chave inesperado 'nome'

Criado em 4 nov. 2017  ·  7Comentários  ·  Fonte: carltongibson/django-filter

Eu uso o exemplo no documento:

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

mas entendi o erro:
TypeError: __init__() got an unexpected keyword argument 'name'

quando procuro o código, descobri que o 'nome' mudou para 'nome_do_campo', o documento é antigo, certo?

Também uso o código:

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

acima está ok, mas quando eu uso o código:

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

Não é trabalho. o sql quey não tem declaração like %somevalue% , por quê?

Obrigado,
Kris

Comentários muito úteis

Olá @zhangqunshi , parece que você está usando o pré-lançamento 2.0.0.dev1. Você está correto, name tornou-se field_name . Os documentos não foram atualizados para refletir isso (o que é parte do motivo pelo qual é um pré-lançamento).

Não é fácil depurar FileEvent sem ver o modelo real. O que acontece quando você executa a consulta a seguir?

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

Todos 7 comentários

Olá @zhangqunshi , parece que você está usando o pré-lançamento 2.0.0.dev1. Você está correto, name tornou-se field_name . Os documentos não foram atualizados para refletir isso (o que é parte do motivo pelo qual é um pré-lançamento).

Não é fácil depurar FileEvent sem ver o modelo real. O que acontece quando você executa a consulta a seguir?

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

FileEvent é simples, tem apenas report_id, file_name e event_time. quando eu uso:

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

Ele se tornará o sql:

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

Para o código:

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

ele se tornará o sql:

select * from file_event where file_name ='foo'

Para o código:

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

ele se tornará o sql:

select * from file_event

BTW, o código para obter o queryset é:

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

E não consigo encontrar nenhuma ajuda do doc, como obter o resultado do filtro em uma visualização comum, então eu procuro o código e encontro o campo 'qs'in BaseFilterSet, e funciona.

Agora eu mudo o código para:

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

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

e funciona, o sql é like '%foo%'

@zhangqunshi , meu palpite é que você está filtrando com uma

/file-events?file_name__icontains=foo

Você está certo, eu uso o url: /file-events?file_name=foo
Porque eu acho que o código já está definido, o campo file_name deve usar o icontains.

Sim. É contra-intuitivo no início, mas a mudança é necessária porque você pode usar a sintaxe do dicionário para definir vários filtros. Por exemplo,

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

Isso permite que você execute consultas como /file-events?file_name__istarswith=foo&file_name__iendswith=log

ok, entendi, e o código ['icontains', 'istartswith', 'iendswith',] é apenas uma lista de tipos de consulta com suporte. Se a consulta não usar nenhum item da lista, o django-filter irá ignorá-la.

Muito obrigado :-)

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

blueyed picture blueyed  ·  4Comentários

sassanh picture sassanh  ·  4Comentários

jnegro picture jnegro  ·  3Comentários

edmorley picture edmorley  ·  3Comentários

madelyneriksen picture madelyneriksen  ·  4Comentários