Applies when building or reviewing Django applications. Covers ORM optimization, middleware, security, caching, migrations, and async views.
select_related() for ForeignKey/OneToOne, prefetch_related() for ManyToMany/reverse FK. Every template or serializer touching a related object without these creates N+1 queries..count(), .exists(), len(), list(), bool(), and iteration trigger evaluation. Chain filters freely..only() and .defer() to limit columns. Accessing a deferred field triggers a per-instance query. Prefer .values() when you don't need instances.bulk_create() and bulk_update() for batch operations. bulk_create(objs, batch_size=1000) is one query, not 1,000.F() expressions for atomic updates. Model.objects.filter(pk=pk).update(counter=F('counter') + 1) avoids race conditions.filter(), , . Use or for composites.order_by()exclude()db_index=TrueMeta.indexesDEBUG=False, ALLOWED_HOSTS, SECURE_SSL_REDIRECT, SESSION_COOKIE_SECURE, CSRF_COOKIE_SECURE, SECURE_HSTS_SECONDS.@cache_page), template fragment ({% cache %}), low-level (cache.get/set). Set KEY_PREFIX.collectstatic in build. Serve media from object storage.sync_to_async() or use async ORM methods (aget(), async for). Sync ORM in async view raises SynchronousOnlyOperation.get_object_or_404() in views. Uncaught DoesNotExist leaks 500 errors.