On Aug 25, 2008, at 3:11 PM, MrJogo wrote:
> > How do I create a custom manager for many-to-many traversal? An > example will illustrate what I want to do better. Suppose I have the > following models.py: > > class Book(models.Model): > title = models.CharField(max_length=100) > > class Author(models.Model): > books = models.ForeignKey(Book) > name = models.CharField(max_length=100) > is_alive = models.BooleanField() > > This is a many-to-many relationship: a book can have multiple authors > and an author can have written multiple books. > > If I have a book object my_book, and I want to get all the authors, I > do my_book.author_set.all(). How can I set up a custom manager to only > get living authors of that book, so I could do something like > my_book.livingauthor_set.all()? Custom managers are usually used for table-level functionality, ie you'd make a manager method that filters or acts on a *group* of books, not one single book. The usual thing to do when you want something from a single object is to put a custom method on Book, which returns living authors, like: def living_authors(self): return self.author_set.filter(is_alive=True) What I don't know is if there's any way to keep this from making another db hit every time you call some_book.living_authors(). QuerySets can't be further filtered once they've been evaluated, so using select_related() on the original Book QuerySet might not help... Yours, Eric > > > Thanks > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---