What you could do is create the intermediary table explicitly using
the through keyword: 
http://docs.djangoproject.com/en/dev//topics/db/models/#extra-fields-on-many-to-many-relationships
then you can do queries on the table.

Alex

On Oct 1, 7:17 pm, "Dan W." <[EMAIL PROTECTED]> wrote:
> This is my first time building an app with django and so far I've been
> more than happy with it. However, I can't seem to figure out how to
> sufficiently optimize queries for ManyToMany relationships. Here is a
> model to illustrate my problem:
>
> class Book(models.Model):
>      name = models.CharField(max_length=255)
>
> class Reader(models.Model):
>      first_name = models.CharField(max_length=30)
>      last_name = models.CharField(max_length=30)
>      books_read = models.ManyToMany(Book, relatedName='read_by')
>
> Now I simply want to list every reader along with the books that
> they've read. For example:
>
> Reader                Books Read
> ----------
> ----------------------------------------------------------
> Claire Smith        Great Expectations
>                           Jane Eyre
>                           Wuthering Heights
> Dan Smith           Great Expectations
>                           War and Peace
>                           Adventures of Sherlock Holmes
> Bob Smith           Adventures of Sherlock Holmes
>                           The Call of the Wild
>                           War and Peace
> ....                      ....
>
> Ideally select_related() would work with ManyToMany relationships as
> well as ForeignKey relationships but I can see that this would take
> the model query API to a whole other level of complixity so I can
> understand why it hasn't been done yet. I'm used to ORM libraries like
> Java's Hibernate that can fetch entire graphs of objects with a
> minimum number of queries but I'm more than happy to do a little extra
> work to avoid the complexity of something like Hibernate.
>
> However, I would hope that I could fetch the necessary data to
> instantiate the object graph for any number of readers with only 2
> queries. The queries would look like:
>     readers = Reader.objects.filter(last_name='Smith');
>     books = Book.objects.filter(read_by__last_name='Smith');
>
> These two queries get me all the data I need but I still don't have
> the connectivity information to know which readers have read which
> books. In order to get this piece of info, it looks like I'll have to
> drop into the native sql world and fetch the info directly from the
> many-to-many table created by django. Is this what necessary to do the
> database optimization or am I missing something? It's not so bad in
> this simple case but as the graph of interesting objects gets bigger,
> I'm afraid I may have to write a lot of this type of code.
>
> Thanks,
>
> --Dan
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to