Imagine the following model:
class Parent(Model):
...
class Child(Model)
father = ForeignKey(Parent)
...
Some parents have children, others do not (they're not parents in the real meaning, it's just a fictional name).
I would like to make the following query: I want to list all the Parents, and if they have children, bring me the children too. That would be the equivalent of a left outer join to Child table, that is:
select * from app_parent left join app_child on child_father_id=parent_id
This way, when I invoke Parent.child_set in my template, I won't hit the database a gazillion times. Is there a way to do that? Thanks
I think you are looking for select_related()
In this case, I think the best thing to do is list the children, then get the parent from them, like this:
Then in the template, possibly use a
regroup
(note theorder_by
above):in django 1.3
Sorry to once again post a link to my blog, but I have written about a technique to simulate select_related on backwards relationships.
Starting from Django 1.4
prefetch_related
does what you want.Related(!) django docs : https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related.