5👍
You are fine. This code will cost you only 3 queries.
As you can see in select_related() documentation:
Returns a QuerySet that will “follow” foreign-key relationships, selecting additional related-object data when it executes its query. This is a performance booster which results in a single more complex query but means later use of foreign-key relationships won’t require database queries.
It means that your code will preform a mysql join
and will result a dataset with all of the data. So by that, I can see that your code is pretty good.
I suggest you use some kind of profiling like django-silk to see how many queries are being generated.
Footnote:
As you can see in prefetch_related() documentation, the difference between prefetch_related()
and select_related()
is in the way they preform the join:
This (prefetch_related) has a similar purpose to select_related, in that both are designed to stop the deluge of database queries that is caused by accessing related objects, but the strategy is quite different.
…
select_related works by creating an SQL join and including the fields
of the related object in the SELECT statement. For this reason,
select_related gets the related objects in the same database query.…
prefetch_related, on the other hand, does a separate lookup for each relationship, and does the ‘joining’ in Python.
So as long as you need one-to-one
relationship, select_related
is the most efficient way to query the relationship.
0👍
I recently realized that the problem in a similar case was not as such the formsets, the problem was the {{formset.errors}} in the template, since each formset generated one query for this.
- IPython doesn't work in Django shell
- Django/Python Runtime Error: Maximum recursion depth exceeded
- How do I simulate connection errors and request timeouts in python unit tests
- 'Questions ' object is not iterable Django