summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-03-21 10:59:25 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-03-21 10:59:25 +0000
commite401ff8ff83d2435428d4ac9a89b5dfc3e67d616 (patch)
tree20e6db046bd5077628222ceb8a3f1ef0c313d654
parent334279f8dd3abd98aa527a1658cb3ff5c3973ec7 (diff)
queryset-refactor: Added some sanity checking to __and__() and __or__() because
some people insist on trying to merge a Queryset and a ValuesQuerySet. git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@7342 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/db/models/query.py17
1 files changed, 17 insertions, 0 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index f9b8baf3b1..7376d13715 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -118,12 +118,22 @@ class _QuerySet(object):
except self.model.DoesNotExist, e:
raise IndexError, e.args
+ def _merge_sanity_check(self, other):
+ """
+ Checks that we are merging two comparable queyrset classes.
+ """
+ if self.__class__ is not other.__class__:
+ raise TypeError("Cannot merge querysets of different types ('%s' and '%s'."
+ % (self.__class__.__name__, other.__class__.__name__))
+
def __and__(self, other):
+ self._merge_sanity_check(other)
combined = self._clone()
combined.query.combine(other.query, sql.AND)
return combined
def __or__(self, other):
+ self._merge_sanity_check(other)
combined = self._clone()
combined.query.combine(other.query, sql.OR)
return combined
@@ -527,6 +537,13 @@ class ValuesQuerySet(QuerySet):
c._setup_query()
return c
+ def _merge_sanity_check(self, other):
+ super(ValuesQuerySet, self)._merge_sanity_check(other)
+ if (set(self.extra_names) != set(other.extra_names) or
+ set(self.field_names) != set(other.field_names)):
+ raise TypeError("Merging '%s' classes must involve the same values in each case."
+ % self.__class__.__name__)
+
class ValuesListQuerySet(ValuesQuerySet):
def iterator(self):
self.field_names.extend([f for f in self.query.extra_select.keys()])