On Apr 25, 2012, at 2:16 AM, Tom Evans wrote: > On Wed, Apr 25, 2012 at 5:58 AM, Lee Hinde <leehi...@gmail.com> wrote: >> I have a table with four or five foreign keys. Using the default form >> widgets, a foreign key is represented by a single value select. >> >> I noticed, with debug_tool_bar, that a query is being made for each >> element of each foreign key select option. Seems like it ought not >> >> I am using >> >> classes = get_object_or_404(Classes, pk=pk) >> >> to load the record. I tried >> Classes.on_site.select_related().get(pk=pk) without any change. >> >> The question is, is this to be expected? >> > > Yes. How else would it get the potential values that can be selected? > > If you want to load all in one query, you can use select_related(). If > select_related() doesn't help, then your foreign keys are probably > nullable, which are not automatically loaded with select_related(). > > FYI, having each foreign key lookup as a separate query may not be a bad > thing. > If the cardinality of the foreign keys doesn't change much (you don't > add frequently add potential new values for that foreign key), then it > is highly likely that those queries would be served from the query > cache. > > If you are displaying 1 million different forms, but all their foreign > key lookups can be served from cache, do you think it would be quicker > to do 1 million queries with 5 joins in each query, with none of the > queries cached, or 5 million queries, 1 million with no joins and 4 > million served from the query cache? > > Cheers > > Tom >
Thanks Tom; I may have been unclear. I would expect at least one query per foreign key to load the potential values, but there is a query for each potential value. i.e.., one of the foreign keys is to an instructor table. There's that query, then there's a query for each instructor as part of the class page load. And yes, I have a lot of nullable foreign keys. In this example, I can have a class but not know yet who the instructor will be. I suppose an alternative to a nullable key would be to have a default, 'no decision made yet' option. Thanks also for the reminder about select_related not following a nullable fk. -- 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 django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.