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值中。