2016-04-09 23 views
3

Django-filterを使用して、2つのフィールドの複数の選択肢に基づいてデータベースをフィルタリングできるようにしています。 filterset.pyは次のようになります。Django-filterのORロジック

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="") 

ただし、これは2つのリスト間の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 

これは私に与えますエラー 'function'オブジェクトには 'count'という属性はありません。

+0

このフィルタをどのように使用しようとしているかなど、さらに詳細が必要になります。 – Abhinav

答えて

1

TapFilterFilterSetサブクラスでは、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) 

をそれがあなたを始動させます。

+0

ご協力ありがとうございます!達成するためのqs = Bar.objects.empty()行は何ですか?私はAttributeErrorを取得します: 'マネージャ'オブジェクトには属性がありません '空です。 – MJHorn

+0

'none'にする必要がありますhttps://docs.djangoproject.com/en/1.9/ref/models/querysets/#none –

+0

私はちょっと鈍い気がしますが、これをどのように適用するか正確にはわかりません。上記を現在の試行で更新しました。 – MJHorn