【发布时间】:2018-12-23 20:39:07
【问题描述】:
我在为我的 ModelViewSet 之一创建过滤器集以为我的 api 中的带注释字段提供过滤器功能(包括所有允许的查找,例如 in、gt、lt、...)时遇到问题。我的代码如下所示:
import rest_framework_filters as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.viewsets import ModelViewSet
class MyViewSet(ModelViewSet):
class MyFilterSet(filters.FilterSet):
""" internal FilterSet """
min_value = filters.AllLookupsFilter()
class Meta:
model = MyModel
fields = {
'id': '__all__',
'name': '__all__',
'type': '__all__',
'managed_by': '__all__',
'created_by': '__all__',
}
filter_backends = (DjangoFilterBackend,)
filter_class = MyFilterSet
def get_queryset(self):
return super().get_queryset().annotate(min_value=Min('field')).order_by('id')
当我尝试启动我的应用程序时,会发生以下异常:
TypeError: 'Meta.fields' 包含未在此 FilterSet 上定义的字段:min_value
知道我的代码有什么问题吗?
我发现我的“djangorestframework-filters”模块已经过时了。我对最新版本(0.10.2)进行了更新,现在错误更改为:
File "C:\Dev\Python\Python36\lib\site-packages\rest_framework_filters\filterset.py", line 44, in __new__ opts.fields = {f.name: f.lookups or []}
AttributeError: 'AllLookupsFilter' object has no attribute 'name'
我已经更新了所有依赖模块。有什么想法吗?
【问题讨论】:
-
你很可能已经安装了 django-filter 2.x。过滤器的
name属性已重命名为field_name。自 django-filter 1.1 以来就存在此重命名/弃用 此外,django-rest-framework-filters 0.10.2 与 django-filter 2.0 不兼容 - 您需要降级 django-filter 直到下一个版本,或者安装 django-rest-framework-filters 的 master 分支。
标签: python django-rest-framework django-filter django-rest-framework-filters