Start here. This is the direct spoken answer to practice first.
Overview
Different actions often need different shapes, but variation should clarify the contract rather than create a maze.
A list action may need a compact serializer and a queryset optimized for many rows, while retrieve may return more detail and create or update may accept a narrower write contract. A ViewSet can override get_queryset() and get_serializer_class() to make those choices by action. The base queryset must still respect tenant and visibility rules for every action.