Python 用于注释字段的筛选器集查找

Python 用于注释字段的筛选器集查找,python,django-rest-framework,django-filter,django-rest-framework-filters,Python,Django Rest Framework,Django Filter,Django Rest Framework Filters,我无法为其中一个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(M

我无法为其中一个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”包含未在此筛选器集上定义的字段:min\u值

知道我的代码有什么问题吗


我发现我的“djangorestframework过滤器”模块已经过时。我对最新版本(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'

我已经更新了所有相关模块。有什么想法吗?这里的问题是什么?

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

您很可能已经安装了django filter 2.x。过滤器的
name
属性已重命名为
field\u name
。自django filter 1.1以来就出现了这种重命名/弃用。此外,django rest framework filter 0.10.2与django filter 2.0不兼容-您需要将django filter降级到下一版本,或者安装django rest framework filter的主分支。