Hi all,

My latest post to the list seems to have been lost in the pre-Christmas
storm. Sorry for that!


The issue of picking which custom manager is used in resolving reverse
relations still stands. Let my give you an example why this is useful:

{{{
class Reporter(models.Model):
    ...

class Article(models.Model):
    reporter = models.ForeignKey(Reporter)
    ...
    articles = models.Manager()
    published_articles = PublishedManager()
}}}

We put some thought into designing PublishedManager. Maybe it needs to
do some things in addition to simply checking a flag, who knows. The
thing is: right now, we simply cannot make use of this manager when
looking up a reporter's articles: with `reporter.article_set` we
always get _all_ articles. [1]


Now we have two options: doing the filtering manually, on the returned
queryset, or specify that we want to use PublishedManager, accessible
through the `published_articles` attribute of the Article class.

The latter is implemented by the patches in ticket #3871:

  https://code.djangoproject.com/ticket/3871


Does this seem like a good idea? Should it even be possible to specify
which custom manager is used for reverse relations? Or, am I missing
something and this is already possible in some other way?

Since I'm looking forward to seeing this implementation in Django 1.4,
I ask for your input on the matter.

Thanks!
Sebastian.

[1] In fact, that's not entirely true: we get whatever is returned by
the _default_ manager of the Article class. This seems like an
arbitrary choice: it's not a "plain" manager that always returns all
related instances, it's whatever we picked as the default manager.


On Fri, 23 Dec 2011 21:56:24 +0100
Sebastian Goll <sebastian.g...@gmx.de> wrote:

> Hi all,
> 
> I'd like to draw your attention to long-open ticket #3871 [1].
> 
> The idea is to let ORM users choose which custom manager to use for reverse 
> "many" relations, i.e. reverse foreign key (…_set) as well as forward and 
> reverse many-to-many relations.
> 
> There are several proposed patches to this ticket, the latest was added by me 
> a week ago. The current implementation adds a "manager()" method to the 
> reverse manager which allows you to pick a manager different from the default 
> one on the related model. All changes are entirely backwards-compatible – if 
> you don't call the "manager()" method, everything is as before, i.e. the 
> default manager is used to look up related model instances.
> 
> 
> During my review of the previous patch I found that it doesn't apply cleanly 
> to trunk, as well as some concerns with regard to the general approach of the 
> implementation.
> 
> Therefore, I wrote an alternative patch which is currently awaiting review. 
> Since I wrote that patch, I cannot review it myself. If you can spare some 
> time, maybe you can take a look at it and if you feel the current approach is 
> okay, bump the ticket to "ready for check-in".
> 
> Of course feel free to raise any concerns you might have.
> 
> Regards,
> Sebastian.
> 
> PS: Merry X-Mas and whatnot! :D
> 
> [1] https://code.djangoproject.com/ticket/3871

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-developers@googlegroups.com.
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en.

Reply via email to