diff -r f7a90d86bf60 django/db/models/query.py
--- a/django/db/models/query.py	Sat Jun 21 20:57:05 2008 +0000
+++ b/django/db/models/query.py	Sun Jun 22 02:57:36 2008 -0400
@@ -746,18 +746,27 @@
         return None
 
     restricted = requested is not None
-    index_end = index_start + len(klass._meta.fields)
+    index_end = index_start + len(klass._meta.local_fields)
     obj = klass(*row[index_start:index_end])
     for f in klass._meta.fields:
-        if (not f.rel or (not restricted and f.null) or
-                (restricted and f.name not in requested) or f.rel.parent_link):
+        if f.rel and f.rel.parent_link:
+            pass
+        elif (not f.rel or (not restricted and f.null) or
+                (restricted and f.name not in requested)):
             continue
+        
         if restricted:
-            next = requested[f.name]
+            next = requested.get(f.name, {})
         else:
             next = None
         cached_row = get_cached_row(f.rel.to, row, index_end, max_depth,
                 cur_depth+1, next)
+        # HACK: Doing it this way means an extra Parent object is created that
+        # shouldn't be.  It would be better to do this before running the
+        # cached row.
+        if f.rel and f.rel.parent_link:
+            for parent_field in cached_row[0]._meta.fields:
+                setattr(obj, parent_field.name, getattr(cached_row[0], parent_field.name))
         if cached_row:
             rel_obj, index_end = cached_row
             setattr(obj, f.get_cache_name(), rel_obj)
diff -r f7a90d86bf60 django/db/models/sql/query.py
--- a/django/db/models/sql/query.py	Sat Jun 21 20:57:05 2008 +0000
+++ b/django/db/models/sql/query.py	Sun Jun 22 02:57:36 2008 -0400
@@ -879,9 +879,12 @@
                 restricted = False
 
         for f, model in opts.get_fields_with_model():
-            if (not f.rel or (restricted and f.name not in requested) or
-                    (not restricted and f.null) or f.rel.parent_link):
-                continue
+            # HACK: This is a touch hacky, but the logic was easiest.
+            if f.rel and f.rel.parent_link:
+                pass
+            elif (not f.rel or (restricted and f.name not in requested) or
+                        (not restricted and f.null)):
+                    continue
             table = f.rel.to._meta.db_table
             if nullable or f.null:
                 promote = True
@@ -903,8 +906,8 @@
                     promote=promote)
             used.add(alias)
             self.related_select_cols.extend([(alias, f2.column)
-                    for f2 in f.rel.to._meta.fields])
-            self.related_select_fields.extend(f.rel.to._meta.fields)
+                    for f2 in f.rel.to._meta.local_fields])
+            self.related_select_fields.extend(f.rel.to._meta.local_fields)
             if restricted:
                 next = requested.get(f.name, {})
             else:
diff -r f7a90d86bf60 tests/regressiontests/model_inheritance_select_related/models.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/regressiontests/model_inheritance_select_related/models.py	Sun Jun 22 02:57:36 2008 -0400
@@ -0,0 +1,45 @@
+"""
+Regression tests for the interaction between model inheritance and
+select_related().
+"""
+
+from django.db import models
+
+class Place(models.Model):
+    name = models.CharField(max_length=50)
+
+    class Meta:
+        ordering = ('name',)
+        
+    def __unicode__(self):
+        return u"%s the place" % self.name
+
+class Restaurant(Place):
+    serves_suhsi = models.BooleanField()
+    serves_steak = models.BooleanField()
+
+    def __unicode__(self):
+        return u"%s the restaurant" % self.name
+
+class Person(models.Model):
+    name = models.CharField(max_length=50)
+    favorite_restaurant = models.ForeignKey(Restaurant)
+
+    def __unicode__(self):
+        return self.name
+
+__test__ = {'API_TESTS':"""
+# Regression for #7246
+
+>>> r1 = Restaurant.objects.create(name="Nobu", serves_suhsi=True, serves_steak=False)
+>>> r2 = Restaurant.objects.create(name="Craft", serves_suhsi=False, serves_steak=True)
+>>> p1 = Person.objects.create(name="John", favorite_restaurant=r1)
+>>> p2 = Person.objects.create(name="Jane", favorite_restaurant=r2)
+
+>>> Person.objects.order_by('name').select_related()
+[<Person: Jane>, <Person: John>]
+
+>>> jane = Person.objects.order_by('name').select_related('favorite_restaurant')[0]
+>>> jane.favorite_restaurant.name
+u'Craft'
+"""}
\ No newline at end of file
