过滤器设置注释字段的查找

2024-09-27 20:17:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在为我的一个modelviewset创建一个filterset时遇到了一个问题,以便为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' contains fields that are not defined on this FilterSet: min_value

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


我发现我的“djangorestframework过滤器”模块已经过时了。我更新了最新版本(0.10.2),现在错误更改为:

^{pr2}$

我已经更新了所有相关模块。有什么意见吗?有什么问题吗?在


Tags: 代码fromimportrest过滤器fieldsbyvalue
1条回答
网友
1楼 · 发布于 2024-09-27 20:17:06

AllLookupsFilter/AutoFilter钩住Meta.fields中使用的相同的过滤器生成代码。过滤器集实际上相当于:

class MyFilterSet(filters.FilterSet):
    class Meta:
        model = MyModel
        fields = {
            'min_value': '__all__',
            ...
        }

过滤器生成使用模型的字段作为确定过滤器适当类型的基础。基本的问题是注解不作为字段存在于模型类上——它们被添加到QuerySet实例中,并且不能检查类型信息。在

相反,有必要为注释声明过滤器。在

^{pr2}$

相关问题 更多 >

    热门问题