Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 16444)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -355,17 +355,18 @@
     def get_validator_unique_lookup_type(self):
         return '%s__exact' % self.name
 
-    def get_choices(self, include_blank=True, blank_choice=BLANK_CHOICE_DASH):
+    def get_choices(self, include_blank=True, blank_choice=BLANK_CHOICE_DASH, limit_choices_to=None):
         """Returns choices with a default blank choices included, for use
         as SelectField choices for this field."""
         first_choice = include_blank and blank_choice or []
         if self.choices:
             return first_choice + list(self.choices)
         rel_model = self.rel.to
+        limit_choices_to = limit_choices_to and limit_choices_to or self.rel.limit_choices_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.complex_filter(limit_choices_to)]
         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.complex_filter(limit_choices_to)]
         return first_choice + lst
 
     def get_choices_default(self):
Index: django/contrib/admin/filters.py
===================================================================
--- django/contrib/admin/filters.py	(revision 16444)
+++ django/contrib/admin/filters.py	(working copy)
@@ -160,7 +160,7 @@
         self.lookup_val = request.GET.get(self.lookup_kwarg, None)
         self.lookup_val_isnull = request.GET.get(
                                       self.lookup_kwarg_isnull, None)
-        self.lookup_choices = field.get_choices(include_blank=False)
+        self.lookup_choices = self.field_choices(field, request, model_admin)
         self.title = self.lookup_title
 
     def has_output(self):
@@ -175,6 +175,9 @@
     def used_params(self):
         return [self.lookup_kwarg, self.lookup_kwarg_isnull]
 
+    def field_choices(self, field, request, model_admin):
+        return field.get_choices(include_blank=False)
+
     def choices(self, cl):
         from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE
         yield {
@@ -399,3 +402,9 @@
             }
 
 FieldListFilter.register(lambda f: True, AllValuesFieldListFilter)
+
+
+class RelatedOnlyFieldListFilter(RelatedFieldListFilter):
+    def field_choices(self, field, request, model_admin):
+        limit_choices_to = {'pk__in': set(model_admin.queryset(request).values_list(field.name, flat=True))}
+        return field.get_choices(include_blank=False, limit_choices_to=limit_choices_to) 
