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
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 :-)
Comentários muito úteis
Olá @zhangqunshi , parece que você está usando o pré-lançamento 2.0.0.dev1. Você está correto,
name
tornou-sefield_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?