Signals are Django's implementation of the observer pattern — they let certain senders notify a set of receivers when specific events occur (like a model being saved or deleted). They enable decoupled code: one part of the app reacts to events in another without direct coupling.
Common built-in signals
pre_save / post_save → before / after a model instance is saved
pre_delete / post_delete → before / after a model instance is deleted
m2m_changed → a ManyToMany relationship changed
request_started / finished→ request lifecycle
user_logged_in / out → authentication events
