diff options
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/query.py | 13 | ||||
| -rw-r--r-- | django/db/models/sql/compiler.py | 2 |
2 files changed, 14 insertions, 1 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py index c9ff437232..8a97e45b88 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -838,12 +838,25 @@ class QuerySet(object): "union() received an unexpected keyword argument '%s'" % (unexpected_kwarg,) ) + # If the query is an EmptyQuerySet, combine all nonempty querysets. + if isinstance(self, EmptyQuerySet): + qs = [q for q in other_qs if not isinstance(q, EmptyQuerySet)] + return qs[0]._combinator_query('union', *qs[1:], **kwargs) if qs else self return self._combinator_query('union', *other_qs, **kwargs) def intersection(self, *other_qs): + # If any query is an EmptyQuerySet, return it. + if isinstance(self, EmptyQuerySet): + return self + for other in other_qs: + if isinstance(other, EmptyQuerySet): + return other return self._combinator_query('intersection', *other_qs) def difference(self, *other_qs): + # If the query is an EmptyQuerySet, return it. + if isinstance(self, EmptyQuerySet): + return self return self._combinator_query('difference', *other_qs) def select_for_update(self, nowait=False, skip_locked=False): diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 9acb56aa84..d1373fcf95 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -379,7 +379,7 @@ class SQLCompiler(object): features = self.connection.features compilers = [ query.get_compiler(self.using, self.connection) - for query in self.query.combined_queries + for query in self.query.combined_queries if not query.is_empty() ] if not features.supports_slicing_ordering_in_compound: for query, compiler in zip(self.query.combined_queries, compilers): |
