Index: django/db/models/query.py
===================================================================
--- django/db/models/query.py	(revision 7534)
+++ django/db/models/query.py	(working copy)
@@ -669,6 +669,23 @@
         if cached_row:
             rel_obj, index_end = cached_row
             setattr(obj, f.get_cache_name(), rel_obj)
+            
+    if restricted:
+        for f in klass._meta.get_all_related_objects():
+            if f.field.related_query_name() not in requested:
+                continue
+            if restricted:
+                next = requested[f.field.related_query_name()]
+            else:
+                next = None
+            cached_row = get_cached_row(f.model, row, index_end, max_depth, cur_depth+1, next)
+            if cached_row:
+                rel_obj, index_end = cached_row
+                if rel_obj.pk:
+                    setattr(obj, f.field.get_cache_name(), rel_obj)
+                else:
+                    setattr(obj, f.field.get_cache_name(), None)
+            
     return obj, index_end
 
 def delete_objects(seen_objs):
Index: django/db/models/sql/query.py
===================================================================
--- django/db/models/sql/query.py	(revision 7534)
+++ django/db/models/sql/query.py	(working copy)
@@ -907,6 +907,22 @@
                 next = False
             self.fill_related_selections(f.rel.to._meta, alias, cur_depth + 1,
                     used, next, restricted)
+        
+        if restricted:
+            for f in opts.get_all_related_objects():
+                if f.field.related_query_name() not in requested:
+                    continue
+                table = f.model._meta.db_table
+                alias = root_alias
+                alias = self.join((alias, table, 'id', f.field.column), exclusions=used, promote=True)
+                used.add(alias)
+                self.related_select_cols.extend([(alias, f2.column) for f2 in f.model._meta.fields])
+                self.related_select_fields.extend(f.model._meta.fields)
+                if restricted:
+                    next = requested.get(f.name, {})
+                else:
+                    next = False
+                self.fill_related_selections(f.model._meta, alias, cur_depth + 1, used, next, restricted)
 
     def add_filter(self, filter_expr, connector=AND, negate=False, trim=False,
             can_reuse=None):
