我使用文档中的示例:
release_year__gt = django_filters.NumberFilter(name='release_date', lookup_expr='year__gt')
但我得到了错误:
TypeError: __init__() got an unexpected keyword argument 'name'
当我查找代码时,我发现“名称”已更改为“字段名称”,文档很旧,对吗??
我也使用代码:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = ['file_name', ]
上面没问题,但是当我使用代码时:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name' : ['icontains'] }
这不是工作。 查询 sql 没有语句like %somevalue%
,为什么?
谢谢,
克里斯
嗨@zhangqunshi ,听起来您正在使用 2.0.0.dev1 预发行版。 你是对的, name
已经变成了field_name
。 文档尚未更新以反映这一点(这是预发布的部分原因)。
在没有看到实际模型的情况下调试FileEvent
并不容易。 执行以下查询时会发生什么?
FileEvent.objects.filter(file_name__icontains='foo')
FileEvent 很简单,只有report_id、file_name 和event_time。 当我使用:
FileEvent.objects.filter(file_name__icontains='foo')
它将成为sql:
select * from file_event where file_name like '%foo%'
对于代码:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = ['file_name', ]
它将变成 sql:
select * from file_event where file_name ='foo'
对于代码:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name' : ['icontains'] }
它将变成 sql:
select * from file_event
顺便说一句,获取查询集的代码是:
filter = MyFilter(request.GET,
queryset=FileEvent.objects.values().filter(report_id=1).order_by(
'-event_time'))
print(filter.qs)
而且我无法从文档中找到任何帮助,即如何在通用视图中从过滤器中获取结果,因此我查找了代码,并在 BaseFilterSet 中找到了字段“qs”,并且它可以工作。
现在我将代码更改为:
class MyFilter(django_filters.FilterSet):
file_name = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = FileEvent
fields = ['file_name',]
它有效,sql 是like '%foo%'
@zhangqunshi ,我的猜测是您正在使用不正确的查询字符串进行过滤。 它应该是:
/file-events?file_name__icontains=foo
你是对的,我使用网址: /file-events?file_name=foo
因为我认为代码已经定义了 file_name 字段应该使用 icontains。
是的。 起初这违反直觉,但更改是必要的,因为您可以使用字典语法来定义多个过滤器。 例如,
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name': ['icontains', 'istartswith', 'iendswith',]}
这使您能够运行/file-events?file_name__istarswith=foo&file_name__iendswith=log
好的,我明白了,代码['icontains', 'istartswith', 'iendswith',]
只是一个受支持的查询类型列表。 如果查询不使用列表中的任何项目,django-filter 将忽略它。
非常感谢 :-)
最有用的评论
嗨@zhangqunshi ,听起来您正在使用 2.0.0.dev1 预发行版。 你是对的,
name
已经变成了field_name
。 文档尚未更新以反映这一点(这是预发布的部分原因)。在没有看到实际模型的情况下调试
FileEvent
并不容易。 执行以下查询时会发生什么?