diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2007-12-19 10:57:54 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2007-12-19 10:57:54 +0000 |
| commit | 519178154be44da2ece9ee9609a0217008616454 (patch) | |
| tree | 668d2ef6f315daf03781b28f54a9c0da5041a0bf | |
| parent | 97091940b1efbc6018133e9f77402c2983fa702f (diff) | |
queryset-refactor: Fixed a problem when adding certain additional filters to a queryset that has precisely one filter attached already.
Refs #6154.
git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@6957 bcc190cf-cafb-0310-a4f2-bffc1f526a37
| -rw-r--r-- | django/db/models/sql/query.py | 7 | ||||
| -rw-r--r-- | django/utils/tree.py | 4 | ||||
| -rw-r--r-- | tests/regressiontests/queries/models.py | 7 |
3 files changed, 16 insertions, 2 deletions
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) [<Item: four>] +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: a1>] +>>> Author.objects.filter(Q(extra__note=n1)|Q(item__note=n3)).filter(id=a1.id) +[<Author: a1>] """} |
