Index: django/db/models/fields/subclassing.py
===================================================================
--- django/db/models/fields/subclassing.py	(revision 16037)
+++ django/db/models/fields/subclassing.py	(working copy)
@@ -22,16 +22,24 @@
     """
     A placeholder class that provides a way to set the attribute on the model.
     """
-    def __init__(self, field):
+    def __init__(self, field, old_descr=None):
         self.field = field
+        self.old_descr = old_descr
 
     def __get__(self, obj, type=None):
         if obj is None:
             raise AttributeError('Can only be accessed via an instance.')
-        return obj.__dict__[self.field.name]
+        if self.old_descr:
+            return self.old_descr.__get__(obj, type)
+        else:
+            return obj.__dict__[self.field.name]
 
     def __set__(self, obj, value):
-        obj.__dict__[self.field.name] = self.field.to_python(value)
+        val = self.field.to_python(value)
+        if self.old_descr:
+            self.old_descr.__set__(obj, val)
+        else:
+            obj.__dict__[self.field.name] = val
 
 def make_contrib(superclass, func=None):
     """
@@ -47,6 +55,10 @@
             func(self, cls, name)
         else:
             super(superclass, self).contribute_to_class(cls, name)
-        setattr(cls, self.name, Creator(self))
+        # If this value already exists on the class it is likely a descriptor
+        # for related fields. Keep it around so we can call it from our
+        # descriptor.
+        old_descr = cls.__dict__.get(self.name)
+        setattr(cls, self.name, Creator(self, old_descr))
 
     return contribute_to_class
Index: tests/modeltests/field_subclassing/tests.py
===================================================================
--- tests/modeltests/field_subclassing/tests.py	(revision 16037)
+++ tests/modeltests/field_subclassing/tests.py	(working copy)
@@ -1,8 +1,9 @@
 from django.core import serializers
 from django.test import TestCase
+from django.core.exceptions import ObjectDoesNotExist
 
 from fields import Small
-from models import DataModel, MyModel, OtherModel
+from models import DataModel, MyModel, OtherModel, FKModel
 
 
 class CustomField(TestCase):
@@ -79,3 +80,21 @@
         o = OtherModel.objects.get()
         self.assertEqual(o.data.first, "a")
         self.assertEqual(o.data.second, "b")
+
+    def test_foreignkey_subclassing(self):
+        obj = FKModel()
+
+        # We have to do something a bit funky to catch this exception due to
+        # it originating in a descriptor.
+        okay = False
+        try:
+            # The next line would have raised a KeyError prior to being fixed.
+            val = obj.data
+        except ObjectDoesNotExist:
+            okay = True
+        self.assertEquals(okay, True)
+
+        target = MyModel.objects.create(name="1", data=Small(1, 2))
+        obj.data = target
+        obj.save()
+        self.assertEqual(obj.data, target)
Index: tests/modeltests/field_subclassing/models.py
===================================================================
--- tests/modeltests/field_subclassing/models.py	(revision 16037)
+++ tests/modeltests/field_subclassing/models.py	(working copy)
@@ -5,7 +5,7 @@
 from django.db import models
 from django.utils.encoding import force_unicode
 
-from fields import Small, SmallField, SmallerField, JSONField
+from fields import Small, SmallField, SmallerField, JSONField, FKSubField
 
 
 class MyModel(models.Model):
@@ -20,3 +20,7 @@
 
 class DataModel(models.Model):
     data = JSONField()
+
+
+class FKModel(models.Model):
+    data = FKSubField(MyModel)
Index: tests/modeltests/field_subclassing/fields.py
===================================================================
--- tests/modeltests/field_subclassing/fields.py	(revision 16037)
+++ tests/modeltests/field_subclassing/fields.py	(working copy)
@@ -71,3 +71,17 @@
         if value is None:
             return None
         return json.dumps(value)
+
+
+class FKSubField(models.ForeignKey):
+    """
+    Subclass ForeignKey to check descriptor overloading. Confirms ticket
+    #15184 has been corrected.
+    """
+    __metaclass__ = models.SubfieldBase
+
+    def __init__(self, cls, *args, **kwargs):
+        super(FKSubField, self).__init__(cls, *args, **kwargs)
+
+    def to_python(self, value):
+        return value
