Index: django/db/models/sql/query.py
===================================================================
--- django/db/models/sql/query.py	(revisione 7526)
+++ django/db/models/sql/query.py	(copia locale)
@@ -82,6 +82,7 @@
         self.extra_where = ()
         self.extra_params = ()
         self.extra_order_by = ()
+        self.extra_join = ()
 
     def __str__(self):
         """
@@ -182,6 +183,7 @@
         obj.extra_where = self.extra_where
         obj.extra_params = self.extra_params
         obj.extra_order_by = self.extra_order_by
+        obj.extra_join = self.extra_join
         obj.__dict__.update(kwargs)
         if hasattr(obj, '_setup_query'):
             obj._setup_query()
@@ -261,6 +263,9 @@
         result.append('FROM')
         result.extend(from_)
         params.extend(f_params)
+        
+        if self.extra_join:
+            result.append(' '.join(self.extra_join))
 
         if where:
             result.append('WHERE %s' % where)
@@ -1379,7 +1384,7 @@
         self.related_select_cols = []
         self.related_select_fields = []
 
-    def add_extra(self, select, select_params, where, params, tables, order_by):
+    def add_extra(self, select, select_params, where, params, tables, order_by, join):
         """
         Adds data to the various extra_* attributes for user-created additions
         to the query.
@@ -1401,6 +1406,8 @@
             self.extra_tables += tuple(tables)
         if order_by:
             self.extra_order_by = order_by
+        if join:
+            self.extra_join += tuple(join)
 
     def trim_extra_select(self, names):
         """
Index: django/db/models/query.py
===================================================================
--- django/db/models/query.py	(revisione 7526)
+++ django/db/models/query.py	(copia locale)
@@ -448,14 +448,14 @@
         return obj
 
     def extra(self, select=None, where=None, params=None, tables=None,
-            order_by=None, select_params=None):
+            order_by=None, select_params=None, join=None):
         """
         Add extra SQL fragments to the query.
         """
         assert self.query.can_filter(), \
                 "Cannot change a query once a slice has been taken"
         clone = self._clone()
-        clone.query.add_extra(select, select_params, where, params, tables, order_by)
+        clone.query.add_extra(select, select_params, where, params, tables, order_by, join)
         return clone
 
     def reverse(self):
