gpt4 book ai didi

python - 带注释字段的过滤器集查找

转载 作者:行者123 更新时间:2023-11-30 22:11:38 26 4
gpt4 key购买 nike

我在为我的 ModelViewSets 之一创建过滤器集以提供 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-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'

我已经更新了所有依赖模块。有什么想法这里有什么问题吗?

最佳答案

AllLookupsFilter/AutoFilter Hook 到 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')
...

关于python - 带注释字段的过滤器集查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51359439/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com