diff --git a/events/common.py b/events/common.py index f2fce56b..6e610b09 100644 --- a/events/common.py +++ b/events/common.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from collections import OrderedDict +from django.db.models.sql.where import AND, OR from django.utils.translation import ugettext as _ from functions.model_utils import EnumChoices @@ -46,3 +47,14 @@ PRICE = EnumChoices(**get_choices_kwargs(price_mapping)) # N2000=(5, _(u'более 2000')), # ) + +class ExtraWhere(object): + def __init__(self, sqls, params, operator=AND): + self.sqls = sqls + self.params = params + self.operator = operator + + def as_sql(self, qn=None, connection=None): + sqls = ["(%s)" % sql for sql in self.sqls] + operator = " {operator} ".format(operator=self.operator) + return operator.join(sqls), tuple(self.params or ()) diff --git a/events/forms.py b/events/forms.py index 4853e060..bc2152ca 100644 --- a/events/forms.py +++ b/events/forms.py @@ -14,7 +14,6 @@ from django.utils.encoding import smart_text, force_text from django.utils.html import format_html from django.utils.safestring import mark_safe from django.db.models import Count, Sum, Q, ForeignKey, ManyToManyField -from django.db.models.sql.where import ExtraWhere, AND, OR from django.db import connection from django.core.exceptions import ValidationError @@ -28,6 +27,7 @@ from country.models import Country from city.models import City from events.common import MEMBERS, VISITORS, PRICE from events.common import members_mapping, visitors_mapping, price_mapping +from events.common import ExtraWhere, OR, AND class FilterCheckboxSelectMultiple(forms.CheckboxSelectMultiple): @@ -261,7 +261,8 @@ class FilterForm(forms.Form): having = [''' `count` > 0 '''] if 'selected' in values: having.append(''' `selected` = 1 ''') - qs.query.having.add(ExtraWhere(having, []), OR) + + qs.query.having.add(ExtraWhere(having, [], OR), AND) qs = qs.values(*values).order_by(*order_by) self.fields[field].queryset = qs print(self.fields[field].queryset.query)