Start here. This is the direct spoken answer to practice first.
Overview
Explains lazy query construction, evaluation triggers, result caching, and repeated-query surprises.
A Django QuerySet is a lazy description of a database query. Chaining filter(), exclude(), or order_by() normally builds a new queryset without running SQL. Iteration, converting to a list, truth testing, length, and other documented evaluation paths execute it. Normal iteration stores the fetched model instances in that queryset's result cache, so iterating the same evaluated queryset again can reuse them.