python - 带注释字段的过滤器集查找
问题描述
我在为我的 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'
我已经更新了所有依赖模块。有什么想法吗?
解决方案
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')
...
推荐阅读
- r - 将当前数据框重塑为另一个数据框并创建新列(连接)
- node.js - 如何使用谷歌语音从长音频中获取文本到文本 node.js
- ruby - Ruby mediainfo(gem)错误“mon超出范围”?
- c++ - 如果同时运行,BIGSERIAL 事务是否安全?(PostgreSQL,libpqxx)
- excel - 如何将 application.vlookup 函数的结果显示为 TextBox.Value?
- sql-server - SQL Server Management Studio 未连接到服务器
- r - R 正则表达式删除除与此正则表达式匹配的数字之外的所有数字
- android - 屏幕旋转后不要重新创建片段,因为它是由 LiveData 观察者创建的
- sitecore - 如何在体验编辑器中打开不是网站主页的外部 FXM 页面
- azure-devops - 部署 AzureDevOps 构建工件