diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 2f37e04a01..147c7970ed 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -792,6 +792,11 @@ class Query(object): q_object.add_to_query(self) return + if self.where and q_object.connector != AND and len(q_object) > 1: + self.where.start_subtree(AND) + subtree = True + else: + subtree = False for child in q_object.children: if isinstance(child, Node): self.where.start_subtree(q_object.connector) @@ -799,6 +804,8 @@ class Query(object): self.where.end_subtree() else: self.add_filter(child, q_object.connector, q_object.negated) + if subtree: + self.where.end_subtree() def setup_joins(self, names, opts, alias, dupe_multis): """ diff --git a/django/utils/tree.py b/django/utils/tree.py index f7963b1110..b3a0e06812 100644 --- a/django/utils/tree.py +++ b/django/utils/tree.py @@ -87,8 +87,8 @@ class Node(object): def start_subtree(self, conn_type): """ Sets up internal state so that new nodes are added to a subtree of the - current node. The conn_type is required so that the new subtree is - connected correctly to any existing nodes in the tree. + current node. The conn_type specifies how the sub-tree is joined to the + existing children. """ if len(self.children) == 1: self.connector = conn_type diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py index 7c0b83096f..5af1a19e62 100644 --- a/tests/regressiontests/queries/models.py +++ b/tests/regressiontests/queries/models.py @@ -459,5 +459,12 @@ order_by() and filter() calls. >>> Item.objects.extra(select={'count': 'select count(*) from queries_item_tags where queries_item_tags.item_id = queries_item.id'}).filter(count=1) [] +Bug #6154 +Multiple filter statements are joined using "AND" all the time. + +>>> Author.objects.filter(id=a1.id).filter(Q(extra__note=n1)|Q(item__note=n3)) +[] +>>> Author.objects.filter(Q(extra__note=n1)|Q(item__note=n3)).filter(id=a1.id) +[] """}