【问题标题】:What is the "'string' in list" equivalent in django_filter?django过滤器中的“列表中的'字符串'”等价物是什么?
【发布时间】:2020-08-20 05:17:44
【问题描述】:

在 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的字段类型是什么?
  • 它是makes = models.CharField(max_length=300, default='[]')。它存储字符串列表。

标签: django-rest-framework django-filter


【解决方案1】:

利用模型设计者的特权,我稍微重建了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 值中。

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 2020-10-19
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多