Django过滤多个URL参数

Eim*_*tas 6 python django django-filter

我正在使用Django过滤器应用在我的网站上构建搜索。这是代码:

class PropertyFilter(django_filters.FilterSet):
city = django_filters.ModelMultipleChoiceFilter(queryset=City.objects.all(), widget = CheckboxSelectMultiple)
trade_type = django_filters.ModelMultipleChoiceFilter(queryset=Trade.objects.all(), widget = CheckboxSelectMultiple)

class Meta:
    model = Property
    fields = ['city', 'trade_type']
Run Code Online (Sandbox Code Playgroud)

问题在于,当用户标记两个城市时,Django过滤器仅通过最后一个URL参数(此案例中的城市2)过滤对象:

http://example.org/lt/list/city=1&city=2

Models.py

class City(models.Model):
    name = models.CharField(max_length=250, verbose_name=_('Name'))
Run Code Online (Sandbox Code Playgroud)

也许我做错了什么?

pun*_*lly 6

您可以创建查询字符串的复数形式,并接受列表作为过滤器参数:

http://example.org/lt/list/?cities=1,2


class CustomFilterList(django_filters.Filter):
    def filter(self, qs, value):
        if value not in (None, ''):
            values = [v for v in value.split(',')]
            return qs.filter(**{'%s__%s' % (self.name, self.lookup_type): values})
        return qs

class PropertyFilter(django_filters.FilterSet):
    city = django_filters.ModelMultipleChoiceFilter(queryset=City.objects.all(), widget = CheckboxSelectMultiple)
    trade_type = django_filters.ModelMultipleChoiceFilter(queryset=Trade.objects.all(), widget = CheckboxSelectMultiple)
    cities = CustomFilterList(name="city", lookup_type="in")

    class Meta:
        model = Property
        fields = ['cities', 'city', 'trade_type']
Run Code Online (Sandbox Code Playgroud)

查看此答案以正确过滤值列表:

可以通过django-filter URL解析器来执行in`lookup_type吗?