【发布时间】: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