Decoupling logic in Django is always an interesting architectural challenge. Recently, I’ve been relying more on Django Signals to keep my models clean and enforce a strict separation of concerns. For those who haven't dug into how they work under the hood: Django signals essentially implement the Observer design pattern. There is a central dispatcher, when a specific action occurs in the application (the sender), the dispatcher routes that event to any function "listening" for it (the receiver), allowing them to execute their own logic independently. In the snippet below, I’m using the post_save signal. Whenever a new Student instance is successfully created, this receiver catches the signal and automatically generates a CreditWallet for them. Why use a signal here instead of just overriding the save() method on the Student model? It comes down to encapsulation. Overriding save() works fine for simple apps, but as a project grows, it can lead to massive, bloated models. By using signals, the Student model remains strictly responsible for student data, while the financial/wallet logic is encapsulated in its own domain. It makes the codebase much easier to maintain, scale, and test. I’m curious to hear from other developers on here: What is the most complex, creative, or technically challenging way you have utilized Django signals in a project? I'd love to learn from your experiences! #Django #Python #SoftwareEngineering #WebDevelopment #Architecture #Coding
Signals are good, but if the goal is to create y, only after x is created, then overriding the save method should suffice. Signals to me is somewhat close to how a middleware behave. Overriding the save method is somewhat close to how a decorator behave.
Only tricky part is debugging when too many signals start firing😅