django_filter 中的“'string' in list”是什么?

What is the "'string' in list" equivalent in 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 将 return 全部包含字母 F(不区分大小写)。不过,过滤也是可能的:/api/dealers/?city=Paris&search=f 将 return 所有来自巴黎的福特、菲亚特等。在这种特定情况下,只能搜索品牌。如果需要将搜索扩展到另一个字段,则必须反映在 search_fields 值中。