Most slow Django apps aren't slow because of the ORM. They're slow because of a few repeatable mistakes that get worse as tables grow.
Quick wins
Measure first
print ( Order . objects . filter ( status = " paid " ). explain ( analyze = True ))
Enter fullscreen mode
Exit fullscreen mode
Fix N+1
orders = ( Order . objects . select_related ( " customer " ) . prefetch_related ( " items " ) . filter ( status = " paid " )[: 1000 ] )
Enter fullscreen mode
Exit fullscreen mode
Load fewer columns
emails = list ( User . objects . values_list ( " email " , flat = True ))
Enter fullscreen mode
Exit fullscreen mode
Keyset pagination instead of deep OFFSET
def next_page ( last_id = None , size = 100 ): qs = Order . objects . order_by ( " id " ) if last_id : qs = qs . filter ( id__gt = last_id ) return list ( qs [: size ])
Enter fullscreen mode
Exit fullscreen mode
Bulk writes and DB-side updates
Order . objects . bulk_update ( changed_orders , [ " status " ], batch_size = 1000 ) Order . objects .…