Overriding the save() method allows custom behavior before or after saving. I call super().save() to preserve default behavior. Common use cases include auto-generating slugs, updating related objects, or validating business rules. I use created check via self.pk to differentiate create vs update. For complex save logic, I consider using signals instead to keep models focused. I'm careful about save recursion and avoid calling save() on related objects that might call back. This pattern centralizes model-specific logic that must run on every save.