diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index a295edf..586100b 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -8,6 +8,7 @@ except ImportError:
 
 from django.db import get_creation_module
 from django.db.models import signals
+import django.db.models.query 
 from django.dispatch import dispatcher
 from django.conf import settings
 from django.core import validators
@@ -359,12 +360,18 @@ class Field(object):
         "Returns a list of tuples used as SelectField choices for this field."
         first_choice = include_blank and blank_choice or []
         if self.choices:
-            return first_choice + list(self.choices)
+            if callable(self.choices):
+                choices = list(self.choices())
+            elif isinstance(self.choices, django.db.models.query.QuerySet):
+                choices = [(x._get_pk_val(), smart_unicode(x)) for x in self.choices]
+            else:
+                choices = list(self.choices)
+            return first_choice + choices
         rel_model = self.rel.to
         if hasattr(self.rel, 'get_related_field'):
-            lst = [(getattr(x, self.rel.get_related_field().attname), smart_unicode(x)) for x in rel_model._default_manager.complex_filter(self.rel.limit_choices_to)]
+            lst = [(getattr(x, self.rel.get_related_field().attname), smart_unicode(x)) for x in rel_model._default_manager.all()]
         else:
-            lst = [(x._get_pk_val(), smart_unicode(x)) for x in rel_model._default_manager.complex_filter(self.rel.limit_choices_to)]
+            lst = [(x._get_pk_val(), smart_unicode(x)) for x in rel_model._default_manager.all()]
         return first_choice + lst
 
     def get_choices_default(self):
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 818c8a9..a596bec 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -506,7 +506,7 @@ class ReverseManyRelatedObjectsDescriptor(object):
 class ManyToOneRel(object):
     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,
+            related_name=None, choices=None, lookup_overrides=None,
             raw_id_admin=False, parent_link=False):
         try:
             to._meta
@@ -516,9 +516,7 @@ class ManyToOneRel(object):
         self.num_in_admin, self.edit_inline = num_in_admin, edit_inline
         self.min_num_in_admin, self.max_num_in_admin = min_num_in_admin, max_num_in_admin
         self.num_extra_on_change, self.related_name = num_extra_on_change, related_name
-        if limit_choices_to is None:
-            limit_choices_to = {}
-        self.limit_choices_to = limit_choices_to
+        self.choices = choices
         self.lookup_overrides = lookup_overrides or {}
         self.raw_id_admin = raw_id_admin
         self.multiple = True
@@ -534,28 +532,26 @@ class ManyToOneRel(object):
 class OneToOneRel(ManyToOneRel):
     def __init__(self, to, field_name, num_in_admin=0, min_num_in_admin=None,
             max_num_in_admin=None, num_extra_on_change=None, edit_inline=False,
-            related_name=None, limit_choices_to=None, lookup_overrides=None,
+            related_name=None, choices=None, lookup_overrides=None,
             raw_id_admin=False, parent_link=False):
         # NOTE: *_num_in_admin and num_extra_on_change are intentionally
         # ignored here. We accept them as parameters only to match the calling
         # signature of ManyToOneRel.__init__().
         super(OneToOneRel, self).__init__(to, field_name, num_in_admin,
                 edit_inline=edit_inline, related_name=related_name,
-                limit_choices_to=limit_choices_to,
+                choices=choices,
                 lookup_overrides=lookup_overrides, raw_id_admin=raw_id_admin,
                 parent_link=parent_link)
         self.multiple = False
 
 class ManyToManyRel(object):
     def __init__(self, to, num_in_admin=0, related_name=None,
-        filter_interface=None, limit_choices_to=None, raw_id_admin=False, symmetrical=True):
+        filter_interface=None, choices=None, raw_id_admin=False, symmetrical=True):
         self.to = to
         self.num_in_admin = num_in_admin
         self.related_name = related_name
         self.filter_interface = filter_interface
-        if limit_choices_to is None:
-            limit_choices_to = {}
-        self.limit_choices_to = limit_choices_to
+        self.choices = choices
         self.edit_inline = False
         self.raw_id_admin = raw_id_admin
         self.symmetrical = symmetrical
@@ -586,7 +582,7 @@ class ForeignKey(RelatedField, Field):
             num_extra_on_change=kwargs.pop('num_extra_on_change', 1),
             edit_inline=kwargs.pop('edit_inline', False),
             related_name=kwargs.pop('related_name', None),
-            limit_choices_to=kwargs.pop('limit_choices_to', None),
+            choices=kwargs.pop('choices', None),
             lookup_overrides=kwargs.pop('lookup_overrides', None),
             raw_id_admin=kwargs.pop('raw_id_admin', False),
             parent_link=kwargs.pop('parent_link', False))
@@ -694,7 +690,7 @@ class ManyToManyField(RelatedField, Field):
             num_in_admin=kwargs.pop('num_in_admin', 0),
             related_name=kwargs.pop('related_name', None),
             filter_interface=kwargs.pop('filter_interface', None),
-            limit_choices_to=kwargs.pop('limit_choices_to', None),
+            choices=kwargs.pop('choices', None),
             raw_id_admin=kwargs.pop('raw_id_admin', False),
             symmetrical=kwargs.pop('symmetrical', True))
         self.db_table = kwargs.pop('db_table', None)
