Start here. This is the direct spoken answer to practice first.
Overview
A serializer can look declarative while triggering a database query for every result row.
An N+1 occurs when the list query loads N objects and serialization later accesses an unloaded relation for each object. I inspect the serializer's fields, nested serializers, properties, and method fields, then shape the view's queryset with select_related() for suitable single-valued joins and prefetch_related() for collections or separate relation queries. The response shape and queryset must be designed together.