17đź‘Ť
You can use select_related
in a chain as following
Comment.objects.select_related('user').select_related('article').all()
11đź‘Ť
If your model has multiple foreign keys you can:
- Call
.select_related()
, that will “follow” all non-null foreign-key relationships - Call
.select_related('foreign_key1', 'foreign_key2', ...)
, that will “follow” only the foreign-key provided as arguments.
Note that "to follow a FK relationship" means selecting additional related-object data when the query is executed (by performing a SQL join). This will make the main query heavier but can be used to avoid N + 1 queries problem.
According to select_related
documentation, the first method (without arguments) is not recommended as "it is likely to make the underlying query more complex, and return more data, than is actually needed."
If your model has "nested" foreign keys with other models (i.e. Book <>-- Author <>-- Hometown
) you can also use select_related
as follow:
- Call
Book.select_related('author__hometown')
, that will “follow” the author’s foreign-key (in Book model) and the hometown’s foreign-key (in Author model).
If your model has many-to-many or many-to-one relations you would like to retrieve from the database, you should take a look at prefetch_related.
- How to properly runserver on different settings for Django?
- Accessing Django OneToOneField in templates?
- How do I use perform_create to set a field automatically in Django Rest Framework?
- Force delete of any previous test database (autoclobber) when running Django unit tests, eg, in PyCharm
7đź‘Ť
On the contrary, the documentation is very clear on the matter. It says that by default all ForeignKeys are followed, but you can give the method a list of fields and it will only follow those relationships.
- Using existing field values in django update query
- AuthAlreadyAssociated Exception in Django Social Auth
- Django factory boy factory with OneToOne relationship and related field
2đź‘Ť
You can pass foreign keys and even nested foreign keys to the select_related
method eg select_related('book__author', 'publisher',)
you can add as many foreign keys as you want, if you call select_related()
without any argument then it will follow all the foreign key relationship which is not recommended at all because you’ll be complicating the query by fetching data you don’t need. Finally, from Django documentation "Chaining select_related calls works in a similar way to other methods – that is that select_related('foo', 'bar')
is equivalent to select_related('foo').select_related('bar')
- Difference between self.request and request in Django class-based view
- Django Override Admin change_form.html Template – display associated model in template
- Django ChoiceField populated from database values
- How can I escape LaTeX special characters inside django templates?
- Django with PyPy