如何解决django_filter中等效的“列表中的”字符串”是什么?
有些条目已添加到Django模型中,它们看起来像:
"makes": [\"Ford\",\"Opel\",\"Mazda\",\"Toyota\",\"Volkswagen\"]
我试图过滤掉所有包含品牌,品牌列表或品牌部分名称的条目,以实现自定义过滤器:
from django_filters import BaseInFilter,CharFilter,FilterSet
from django_filters.rest_framework import DjangoFilterBackend
[...]
class ValueInFilter(BaseInFilter,CharFilter):
pass
class Value(FilterSet):
value__in = ValueInFilter(field_name='makes',lookup_expr='in')
class Meta:
model = Dealer
fields = '__all__'
class DealerViewSet(viewsets.ModelViewSet):
queryset = Dealer.objects.all()
serializer_class = DealerSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['type','city','makes','reputation']
没有自定义过滤器,我只能查询类似/api/dealers/?makes=["Ford"]
的内容,以获得仅包含福特经销商的结果。 (1)我应该如何配置过滤器以从URL中去除括号和引号?
(2)我也想让经销商销售福特和其他品牌,例如:
makes = ["Ford","Opel","Mazda","Toyota","Volkswagen"]
"Ford" in makes
True
(3)另外,我希望能够只输入/api/dealers/?makes=f
并获得福特经销商和菲亚特经销商。
如何使其成为可能?
解决方法
利用模型设计者的特权,我重新构建了makes
的存储方式。
通过应用",".join(makes)
,我得到了类似的内容:makes = "Ford,Opel,Mazda,Toyota,Volkswagen"
(这是一个字符串;从技术上讲是CSV)。
现在,我可以搜索而不是过滤了。视图集需要添加以下行:
from rest_framework import filters
[...]
filter_backends = [filters.SearchFilter]
search_fields = ['$makes']
$
符号为执行RegEx搜索提供了机会,因此查询/api/dealers/?search=f
将返回所有包含字母F(不区分大小写)的品牌。仍然可以进行过滤:/api/dealers/?city=Paris&search=f
将从巴黎返回所有福特,菲亚特等汽车。在这种特定情况下,只能搜索品牌。如果需要将搜索范围扩展到其他字段,则必须将其反映在search_fields
值中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。