select_related is used for ForeignKey and OneToOne relationships and performs a SQL JOIN to get related data in one query. prefetch_related is for Many-to-Many and reverse ForeignKey relationships and runs separate queries, but joins them in Python.
-
Identify N+1 issues by monitoring SQL queries during development
-
Use
select_related
to optimize foreign key lookups -
Apply
prefetch_related
for reverse relationships and many-to-many fields -
Leverage Django Debug Toolbar to detect and profile queries
-
Avoid querying inside loops—fetch related data in bulk
-
Use
.only()
and.defer()
to limit retrieved fields for performance -
Regularly review ORM queries to prevent future N+1 issues