【问题标题】:OR logic with Django-filter使用 Django 过滤器的 OR 逻辑
【发布时间】:2016-04-09 12:57:54
【问题描述】:

我使用Django-filter 允许用户根据两个字段中的多项选择来过滤数据库。 filterset.py 看起来像这样:

class TapFilter(django_filters.FilterSet):
bar__region = django_filters.MultipleChoiceFilter(choices=CHOICES, label="Regions:", widget=forms.CheckboxSelectMultiple,help_text="")
bar = django_filters.ModelMultipleChoiceFilter(queryset=Bar.objects.all(), label="Bars:", widget=forms.CheckboxSelectMultiple,help_text="")

但是,这用作两个列表之间的 AND。我需要 OR 代替。也就是说,我需要显示与任一类别中的选择匹配的任何内容。

我看到过使用普通过滤器的类似问题,但如果可能的话,我更愿意继续使用 django-filter。

有问题的网站在这里:http://bestap.pythonanywhere.com/

更新:我已将它放在我的 filtersets.py 中,但显然我做的不对...

class TapFilter(django_filters.FilterSet):
    bar__region = django_filters.MultipleChoiceFilter(choices=CHOICES, label="Regions:", widget=forms.CheckboxSelectMultiple,help_text="")
    bar = django_filters.ModelMultipleChoiceFilter(queryset=Bar.objects.all(), label="Bars:", widget=forms.CheckboxSelectMultiple,help_text="")
    def qs(self):
        base_qs = Bar.objects.all()
        qs = Bar.objects.none()
        for name, filter_ in six.iteritems(self.filters):
            value = self.form.cleaned_data[name]
            qs = qs | filter_.filter(base_qs, value)
        return qs

这给了我错误“函数”对象没有属性“计数”。

【问题讨论】:

  • 您需要了解更多详细信息,例如您如何尝试使用此过滤器。

标签: python django django-filter


【解决方案1】:

您需要在 TapFilter FilterSet 子类上覆盖 qs

base implementation is not that complicated; essence of it loops over the filters applying them to the queryset

简化:

for name, filter_ in six.iteritems(self.filters):
    value = self.form.cleaned_data[name]
    qs = filter_.filter(qs, value)

你需要过滤器的查询集的联合,因为QuerySet implements __or__,你可以得到它,所以(再次简化)你需要类似的东西:

base_qs = Bar.objects.all()
qs = Bar.objects.none()
for name, filter_ in six.iteritems(self.filters):
    value = self.form.cleaned_data[name]
    qs = qs | filter_.filter(base_qs, value)

希望这能让你开始。

【讨论】:

  • 感谢您的帮助! qs = Bar.objects.empty() 行打算实现什么?我得到 AttributeError: 'Manager' object has no attribute 'empty'。
  • 我觉得有点迟钝,但不确定如何应用它。已根据当前尝试进行了以上更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2013-03-17
  • 2014-02-14
相关资源
最近更新 更多