Django-filter: 类型错误:__init__() 得到了一个意外的关键字参数“名称”

创建于 2017-11-04  ·  7评论  ·  资料来源: carltongibson/django-filter

我使用文档中的示例:

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

所有7条评论

@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 将忽略它。

非常感谢 :-)

此页面是否有帮助?
0 / 5 - 0 等级