Index: db/models/base.py
===================================================================
--- db/models/base.py	(revision 15935)
+++ db/models/base.py	(working copy)
@@ -9,7 +9,7 @@
 from django.core import validators
 from django.db.models.fields import AutoField, FieldDoesNotExist
 from django.db.models.fields.related import (OneToOneRel, ManyToOneRel,
-    OneToOneField, add_lazy_relation)
+    OneToOneField, add_lazy_relation, ReverseSingleRelatedObjectDescriptorParent)
 from django.db.models.query import Q
 from django.db.models.query_utils import DeferredAttribute
 from django.db.models.deletion import Collector
@@ -155,7 +155,7 @@
                 elif not is_proxy:
                     attr_name = '%s_ptr' % base._meta.module_name
                     field = OneToOneField(base, name=attr_name,
-                            auto_created=True, parent_link=True)
+                            auto_created=True, rev_class = ReverseSingleRelatedObjectDescriptorParent, parent_link=True)
                     new_class.add_to_class(attr_name, field)
                 else:
                     field = None
Index: db/models/fields/related.py
===================================================================
--- db/models/fields/related.py	(revision 15935)
+++ db/models/fields/related.py	(working copy)
@@ -374,6 +374,26 @@
         # object you just set.
         setattr(instance, self.field.get_cache_name(), value)
 
+class ReverseSingleRelatedObjectDescriptorParent(ReverseSingleRelatedObjectDescriptor):
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            return self
+
+        cache_name = self.field.get_cache_name()
+        try:
+            return getattr(instance, cache_name)
+        except AttributeError:
+            kwargs = {}
+            for field in self.field.rel.to._meta.fields:
+                if isinstance(field.rel, ManyToOneRel):
+                    key = field.attname
+                else:
+                    key = field.name
+                kwargs[key] = getattr(instance, key)
+            rel_obj = self.field.rel.to(**kwargs)
+            setattr(instance, cache_name, rel_obj)
+            return rel_obj
+
 class ForeignRelatedObjectsDescriptor(object):
     # This class provides the functionality that makes the related-object
     # managers available as attributes on a model class, for fields that have
@@ -815,7 +835,7 @@
         'invalid': _('Model %(model)s with pk %(pk)r does not exist.')
     }
     description = _("Foreign Key (type determined by related field)")
-    def __init__(self, to, to_field=None, rel_class=ManyToOneRel, **kwargs):
+    def __init__(self, to, to_field=None, rel_class=ManyToOneRel, rev_class = ReverseSingleRelatedObjectDescriptor, **kwargs):
         try:
             to_name = to._meta.object_name.lower()
         except AttributeError: # to._meta doesn't exist, so it must be RECURSIVE_RELATIONSHIP_CONSTANT
@@ -837,6 +857,7 @@
             parent_link=kwargs.pop('parent_link', False),
             on_delete=kwargs.pop('on_delete', CASCADE),
         )
+        self.rev_class = rev_class
         Field.__init__(self, **kwargs)
 
     def validate(self, value, model_instance):
@@ -889,7 +910,7 @@
 
     def contribute_to_class(self, cls, name):
         super(ForeignKey, self).contribute_to_class(cls, name)
-        setattr(cls, self.name, ReverseSingleRelatedObjectDescriptor(self))
+        setattr(cls, self.name, self.rev_class(self))
         if isinstance(self.rel.to, basestring):
             target = self.rel.to
         else:
@@ -939,9 +960,9 @@
     rather than returning a list.
     """
     description = _("One-to-one relationship")
-    def __init__(self, to, to_field=None, **kwargs):
+    def __init__(self, to, to_field=None, rev_class = ReverseSingleRelatedObjectDescriptor, **kwargs):
         kwargs['unique'] = True
-        super(OneToOneField, self).__init__(to, to_field, OneToOneRel, **kwargs)
+        super(OneToOneField, self).__init__(to, to_field, OneToOneRel, rev_class, **kwargs)
 
     def contribute_to_related_class(self, cls, related):
         setattr(cls, related.get_accessor_name(),
