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'
我已经更新了所有相关模块。有什么想法是这里的问题吗?
答案 0 :(得分:3)
AllLookupsFilter
/ AutoFilter
挂钩到Meta.fields
中使用的相同过滤器生成代码。您的过滤器集实际上等效于:
class MyFilterSet(filters.FilterSet):
class Meta:
model = MyModel
fields = {
'min_value': '__all__',
...
}
过滤器的生成以模型的字段为基础,以确定适当的过滤器类型。基本问题是模型类中的注释不作为字段存在-它们被添加到QuerySet
实例中,并且无法检查类型信息。
相反,必须声明用于注释的过滤器。
class MyFilterSet(filters.FilterSet):
min_value = filters.NumberFilter(field_name='min_value', lookup_expr='exact')
min_value__gt = filters.NumberFilter(field_name='min_value', lookup_expr='gt')
...