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