--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -321,6 +321,29 @@ class QuerySet(object):
         if tables: clone._tables.extend(tables)
         return clone
 
+    ########################
+    # PUBLIC CLASS METHODS #
+    ########################
+
+    def list_union(cls, model, queries):
+        """Returns the list_union of a list of QuerySets.
+        Returns a new QuerySet.
+        """
+        if not queries:
+            return cls(model).extra(where=["1=0"])
+        return reduce(cls.__or__, queries)
+
+    list_union = classmethod(list_union)
+
+    def list_intersection(cls, model, queries):
+        """Returns the list_intersection of a list of QuerySets, a QuerySet."""
+        if not queries:
+            return cls(model).extra(where=["1=0"])
+        else:
+            return reduce(cls.__and__, queries)
+
+    list_intersection = classmethod(list_intersection)
+
     ###################
     # PRIVATE METHODS #
     ###################
--- /dev/null
+++ b/tests/modeltests/union_intersection/models.py
@@ -0,0 +1,102 @@
+"""
+XX. list_union() and list_intersection()
+
+These class methods consolidate a list of QuerySets into a single QuerySet.
+This is really just a way to use `|` or `&` on all the lists.
+
+"""
+
+from django.db import models
+
+class Journal(models.Model):
+    name = models.CharField(maxlength=100)
+
+    def __repr__(self):
+        return name
+
+class Reporter(models.Model):
+    first_name = models.CharField(maxlength=30)
+    last_name = models.CharField(maxlength=30)
+    email = models.EmailField()
+
+    def __repr__(self):
+        return "%s %s" % (self.first_name, self.last_name)
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100)
+    reporter = models.ForeignKey(Reporter, null=True)
+    journal = models.ForeignKey(Journal, null=True)
+
+    def __repr__(self):
+        return self.headline
+
+    class Meta:
+        ordering = ('headline',)
+
+
+
+API_TESTS = """
+>>> from django.db.models.query import QuerySet
+
+# Create a few Entries
+>>> r = Reporter(first_name='John', last_name='Smith', email='john@example.com')
+>>> r.save()
+
+>>> r2 = Reporter(first_name='Paul', last_name='Jones', email='paul@example.com')
+>>> r2.save()
+
+>>> r3 = Reporter(first_name='Mike', last_name='Miller', email='mike@example.com')
+>>> r3.save()
+
+>>> j1 = Journal(name="Daily Shadow")
+>>> j1.save()
+
+>>> j2 = Journal(name="Nightly Light")
+>>> j2.save()
+
+>>> a1 = r.article_set.create(headline='Hello', journal=j1)
+>>> a1.save()
+
+>>> a2 = r2.article_set.create(headline='Goodbye', journal=j1)
+>>> a2.save()
+
+>>> a3 = r2.article_set.create(headline='Hello and goodbye', journal=j2)
+>>> a3.save()
+
+>>> a4 = r3.article_set.create(headline='Have a nice day', journal=j1)
+>>> a4.save()
+
+>>> a5 = Article(headline='Never mind')
+>>> a5.save()
+
+# pathologic cases: empty lists and empty QuerySets
+>>> QuerySet.list_union(Article, []).count()
+0
+
+>>> QuerySet.list_intersection(Article, []).count()
+0
+
+>>> QuerySet.list_union(Reporter, [Reporter.objects.filter(first_name=str(i)) for i in range(3)]).count()
+0
+
+>>> QuerySet.list_intersection(Reporter, [Reporter.objects.filter(first_name=str(i)) for i in range(3)]).count()
+0
+
+# normal case ... find all articles from reporters from example.com
+# of course you could write this easier as Article.objects.filter(reporter__email__iendswith=...)
+>>> QuerySet.list_union(Article, [reporter.article_set.all() for reporter in Reporter.objects.filter(email__iendswith='@example.com')])
+[Goodbye, Have a nice day, Hello, Hello and goodbye]
+
+# all the articles from reporters who have written more than one article.
+# note that this will fetch only the required articles from the database
+# this could be written with custom sql using extra()
+>>> reporter_articles = [(reporter, reporter.article_set.all()) for reporter in Reporter.objects.all()]
+>>> QuerySet.list_union(Article, [articles for reporter,articles in reporter_articles if articles.count() > 1])
+[Goodbye, Hello and goodbye]
+
+# Let's find all authors that have created articles in all known journals
+>>> [Reporter.objects.filter(article__journal__id__exact=journal.id) for journal in Journal.objects.all()]
+[[John Smith, Paul Jones, Mike Miller], [Paul Jones]]
+>>> QuerySet.list_intersection(Reporter, [Reporter.objects.filter(article__journal__id__exact=journal.id) for journal in Journal.objects.all()])
+[Paul Jones]
+"""
