Index: django/db/models/fields/related.py
===================================================================
--- django/db/models/fields/related.py	(revision 7320)
+++ django/db/models/fields/related.py	(working copy)
@@ -548,6 +548,13 @@
             params['choices'] = self.get_choices_default()
         return field_objs, params
 
+    def get_default(self):
+        "Here we check if the default value is an object and return the to_field if so."
+        field_default = super(ForeignKey, self).get_default()
+        if isinstance(field_default, self.rel.to):
+            return getattr(field_default, self.rel.get_related_field().attname)
+        return field_default
+
     def get_manipulator_field_objs(self):
         rel_field = self.rel.get_related_field()
         if self.rel.raw_id_admin and not isinstance(rel_field, AutoField):
Index: tests/regressiontests/model_fields/models.py
===================================================================
--- tests/regressiontests/model_fields/models.py	(revision 7320)
+++ tests/regressiontests/model_fields/models.py	(working copy)
@@ -0,0 +1,24 @@
+
+from django.db import models
+
+class Foo(models.Model):
+    a = models.CharField(max_length=10)
+
+def get_foo():
+    return Foo.objects.get(id=1)
+
+class Bar(models.Model):
+    b = models.CharField(max_length=10)
+    a = models.ForeignKey(Foo, default=get_foo)
+
+__test__ = {'API_TESTS':"""
+# Create a couple of Places.
+>>> f = Foo.objects.create(a='abc')
+>>> f.id
+1
+>>> b = Bar(b = "bcd")
+>>> b.a
+<Foo: Foo object>
+>>> b.save()
+
+"""}
Index: docs/model-api.txt
===================================================================
--- docs/model-api.txt	(revision 7320)
+++ docs/model-api.txt	(working copy)
@@ -626,7 +626,8 @@
 ``default``
 ~~~~~~~~~~~
 
-The default value for the field.
+The default value for the field. This can be a value or a callable object. 
+If callable it will be used every time a new object is created. 
 
 ``editable``
 ~~~~~~~~~~~~
