Introduction
We use __str__ to show a friendly name for objects when we print them or see them in admin. It helps us understand what the object is without extra code.
When you want to see a readable name for your model objects in Django admin.
When printing model instances in the console or logs to understand what they represent.
When debugging and you want clear output instead of default object memory addresses.
When displaying model objects in templates or other parts of your app where a string is needed.