Index: django/db/models/manipulators.py
===================================================================
--- django/db/models/manipulators.py	(revision 3898)
+++ django/db/models/manipulators.py	(working copy)
@@ -264,7 +264,7 @@
                 # Sanity check -- Make sure the "parent" object exists.
                 # For example, make sure the Place exists for the Restaurant.
                 # Let the ObjectDoesNotExist exception propagate up.
-                limit_choices_to = self.opts.one_to_one_field.rel.limit_choices_to
+                limit_choices_to = self.opts.one_to_one_field.rel.evaluate_limit_choices_to()
                 lookup_kwargs = {'%s__exact' % self.opts.one_to_one_field.rel.field_name: obj_key}
                 self.opts.one_to_one_field.rel.to.get_model_module().complex_filter(limit_choices_to).get(**lookup_kwargs)
                 params = dict([(f.attname, f.get_default()) for f in self.opts.fields])
Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 3898)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -291,9 +291,9 @@
             return first_choice + list(self.choices)
         rel_model = self.rel.to
         if hasattr(self.rel, 'get_related_field'):
-            lst = [(getattr(x, self.rel.get_related_field().attname), str(x)) for x in rel_model._default_manager.complex_filter(self.rel.limit_choices_to)]
+            lst = [(getattr(x, self.rel.get_related_field().attname), str(x)) for x in rel_model._default_manager.complex_filter(self.rel.evaluate_limit_choices_to())]
         else:
-            lst = [(x._get_pk_val(), str(x)) for x in rel_model._default_manager.complex_filter(self.rel.limit_choices_to)]
+            lst = [(x._get_pk_val(), str(x)) for x in rel_model._default_manager.complex_filter(self.rel.evaluate_limit_choices_to())]
         return first_choice + lst
 
     def get_choices_default(self):
Index: django/db/models/fields/related.py
===================================================================
--- django/db/models/fields/related.py	(revision 3898)
+++ django/db/models/fields/related.py	(working copy)
@@ -450,7 +450,18 @@
         for obj in value:
             manager.add(obj)
 
-class ForeignKey(RelatedField, Field):
+class LimitedChoices(object):
+    def evaluate_limit_choices_to(self):
+        limiters = {}
+        if self.limit_choices_to:
+            for id in self.limit_choices_to:
+                value = self.limit_choices_to[id]
+                if callable(value):
+                    value = value()
+                limiters[id] = value
+        return limiters 
+
+class ForeignKey(RelatedField, Field, LimitedChoices):
     empty_strings_allowed = False
     def __init__(self, to, to_field=None, **kwargs):
         try:
@@ -600,7 +611,7 @@
         if not cls._meta.one_to_one_field:
             cls._meta.one_to_one_field = self
 
-class ManyToManyField(RelatedField, Field):
+class ManyToManyField(RelatedField, Field, LimitedChoices):
     def __init__(self, to, **kwargs):
         kwargs['verbose_name'] = kwargs.get('verbose_name', None)
         kwargs['rel'] = ManyToManyRel(to,
@@ -706,7 +717,7 @@
     def set_attributes_from_rel(self):
         pass
 
-class ManyToOneRel(object):
+class ManyToOneRel(LimitedChoices):
     def __init__(self, to, field_name, num_in_admin=3, min_num_in_admin=None,
         max_num_in_admin=None, num_extra_on_change=1, edit_inline=False,
         related_name=None, limit_choices_to=None, lookup_overrides=None, raw_id_admin=False):
@@ -729,7 +740,7 @@
         "Returns the Field in the 'to' object to which this relationship is tied."
         return self.to._meta.get_field(self.field_name)
 
-class OneToOneRel(ManyToOneRel):
+class OneToOneRel(ManyToOneRel,LimitedChoices):
     def __init__(self, to, field_name, num_in_admin=0, edit_inline=False,
         related_name=None, limit_choices_to=None, lookup_overrides=None,
         raw_id_admin=False):
@@ -743,7 +754,7 @@
         self.raw_id_admin = raw_id_admin
         self.multiple = False
 
-class ManyToManyRel(object):
+class ManyToManyRel(LimitedChoices):
     def __init__(self, to, num_in_admin=0, related_name=None,
         filter_interface=None, limit_choices_to=None, raw_id_admin=False, symmetrical=True):
         self.to = to
Index: django/contrib/admin/views/main.py
===================================================================
--- django/contrib/admin/views/main.py	(revision 3898)
+++ django/contrib/admin/views/main.py	(working copy)
@@ -733,7 +733,7 @@
                 qs = qs & other_qs
 
         if self.opts.one_to_one_field:
-            qs = qs.complex_filter(self.opts.one_to_one_field.rel.limit_choices_to)
+            qs = qs.complex_filter(self.opts.one_to_one_field.rel.evaluate_limit_choices_to())
 
         return qs
 
