Start here. This is the direct spoken answer to practice first.
Overview
Chooses Django relationship loading from relationship shape, result cardinality, and measured query behavior.
select_related() follows foreign-key and one-to-one relationships with SQL joins, so the related single object arrives in the same query. prefetch_related() runs separate queries and joins their results in Python, which also supports reverse and many-to-many relationships. Both prevent repeated relationship queries, but they trade round trips, row width, Python memory, and database work differently.