Get foreign key objects in a single query
django, django-queryset, python
Solution
As Ofri says, `select_related` only works on forwards relations, not reverse ones.
There's no built-in way to automatically follow reverse relations in Django, but see my blog post for a technique to do it reasonably efficiently. The basic idea is to get all the related objects for every item at once, then associate them manually with their related item - so you can do it in 2 queries rather than n+1.
Problem
I have 2 models in my Django code: ``` class ModelA(models.Model): name = models.CharField(max_length=255) description = models.CharField(max_length=255) created_by = models.ForeignKey(User) class ModelB(models.Model): category = models.CharField(max_length=255) modela_link = models.ForeignKey(ModelA, 'modelb_link') functions = models.CharField(max_length=255) created_by = models.ForeignKey(User) ``` Say ModelA has 100 records, all of which may or may not have links to ModelB Now say I want to get a list of every ModelA record along with the data from ModelB I would do: ``` list_a = ModelA.objects.all() ``` Then to get the data for ModelB I would have to do ``` for i in list_a: i.additional_data = i.modelb_link.all() ``` However, this runs a query on every instance of i. Thus making 101 queries to run. Is there any way of running this all in just 1 query? Or at least less than the 101 queries. I've tried putting in `ModelA.objects.select_related().all()` but this didn't seem to have any effect.