=== modified file 'django/db/models/fields/related.py'
--- django/db/models/fields/related.py  2007-04-29 12:33:13 +0000
+++ django/db/models/fields/related.py  2007-05-01 18:44:40 +0000
@@ -194,8 +194,9 @@
     # multiple "remote" values and have a ForeignKey pointed at them by
     # some other model. In the example "poll.choice_set", the choice_set
     # attribute is a ForeignRelatedObjectsDescriptor instance.
-    def __init__(self, related):
+    def __init__(self, related, manager=None):
         self.related = related   # RelatedObject instance
+        self.manager = manager
 
     def __get__(self, instance, instance_type=None):
         if instance is None:
@@ -206,7 +207,10 @@
 
         # Dynamically create a class that subclasses the related
         # model's default manager.
-        superclass = self.related.model._default_manager.__class__
+        if self.manager == None:
+            superclass = self.related.model._default_manager.__class__
+        else:
+            superclass = self.manager.__class__
 
         class RelatedManager(superclass):
             def get_query_set(self):
@@ -388,17 +392,21 @@
     # some other model (rather than having a ManyToManyField themselves).
     # In the example "publication.article_set", the article_set attribute is a
     # ManyRelatedObjectsDescriptor instance.
-    def __init__(self, related):
+    def __init__(self, related, manager=None):
         self.related = related   # RelatedObject instance
 
     def __get__(self, instance, instance_type=None):
         if instance is None:
             raise AttributeError, "Manager must be accessed via instance"

         # Dynamically create a class that subclasses the related
         # model's default manager.
+
+        if self.manager == None:
+            superclass = self.related.model._default_manager.__class__
+        else:
+            superclass = self.manager.__class__
+        
         rel_model = self.related.model
-        superclass = rel_model._default_manager.__class__
         RelatedManager = create_many_related_manager(superclass)
 
         qn = backend.quote_name
@@ -550,7 +558,14 @@
         setattr(cls, self.name, ReverseSingleRelatedObjectDescriptor(self))
 
     def contribute_to_related_class(self, cls, related):
-        setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related))
+        related_accessor_name = related.get_accessor_name()
+        remote_accessors = related.get_remote_accessors()
+
+        setattr(cls, related_accessor_name, ForeignRelatedObjectsDescriptor(related))
+
+        # Adding accessors with different managers
+        for racc in remote_accessors:
+            setattr(cls, "%s__%s" % (related_accessor_name, racc[0]), ForeignRelatedObjectsDescriptor(related, racc[1]))
 
     def formfield(self, **kwargs):
         defaults = {'form_class': forms.ModelChoiceField, 'queryset': self.rel.to._default_manager.all()}
@@ -723,8 +738,16 @@
         # m2m relations to self do not have a ManyRelatedObjectsDescriptor,
         # as it would be redundant - unless the field is non-symmetrical.
         if related.model != related.parent_model or not self.rel.symmetrical:
-            # Add the descriptor for the m2m relation
-            setattr(cls, related.get_accessor_name(), ManyRelatedObjectsDescriptor(related))
+            related_accessor_name = related.get_accessor_name()
+            remote_accessors = related.get_remote_accessors()
+
+            # Add the descriptor for the m2m relation, using the default manager
+            # AND keeping backwards compatibility
+            setattr(cls, related_accessor_name, ManyRelatedObjectsDescriptor(related))
+
+            # Addin accessors with different managers
+            for racc in remote_accessors:
+                setattr(cls, "%s__%s" % (related_accessor_name, racc[0]), ManyRelatedObjectsDescriptor(related, racc[1]))
 
         # Set up the accessors for the column names on the m2m table
         self.m2m_column_name = curry(self._get_m2m_column_name, related)

=== modified file 'django/db/models/related.py'
--- django/db/models/related.py 2007-04-29 12:33:13 +0000
+++ django/db/models/related.py 2007-05-01 17:46:08 +0000
@@ -19,6 +19,14 @@
         self.name = '%s:%s' % (self.opts.app_label, self.opts.module_name)
         self.var_name = self.opts.object_name.lower()
 
+    def get_remote_accessors(self):
+        d = []
+        from django.db.models.manager import ManagerDescriptor
+        for name, attr in self.model.__dict__.items():
+            if isinstance(attr, ManagerDescriptor):
+                d.append((name, attr.manager))
+        return d
+
     def flatten_data(self, follow, obj=None):
         new_data = {}
         rel_instances = self.get_list(obj)


