Alternative for prepared()
There isn't really a comparable API anymore. I was about to submit a new issue but found this one, which seems to be the same, so I'll post mine here: 

I had implemented a decently functional change-tracking system to my peewee v2 integration, which allows me to log/record any changes made to models that this feature is enabled for. In order to do this, I leveraged the `post_init` signal (though for reasons I can't remember, I basically merged the `playhouse.signals` code into my base model to call instance methods (e.g. `self._post_init()`) rather than signals).

I recently started migrating to peewee v3 and I found that this signal was removed, and I can't find a convenient way to replicate it. 

This signal is important because I use it to store the initial data of the model, by copying `self._data` (or `self.__data__` in v3) to a separate dict. Then when the model is saved, I compare these old/original values against the current `self._data`/`self.__data__` to determine the differences, generating any relevant "change history" records.

Would it be possible to restore this signal or similar functionality (e.g. `self.prepared()`)? Or do you have any suggestions on how I could build this out? This is the only thing holding me back from migrating to v3 (I'm a big fan of all the other changes/updates).  Well, as I wrote, there isn't really a comparable API anymore. You should probably isolate the places in your codebase where changes can occur and do the tracking there. Implementing a service layer is one option. Ok bummer. Definitely not a fan of separate service layers. I like having only one way to CRUD (e.g. [wicked domain models](https://vimeo.com/43598193)), which is why hooking into these signals made change tracking so easy/transparent. I will think of something... I can't remember how exactly I did it since I left the company that I used it for. But the way I did it is I override __setattr__ (again not 100% sure I haven't used peewee & python in a while) with my BaseAuditModel that inherits ndb.Model. Then when a set happens, I check if __originalValue__ is None then copy __data__ to __originalValue__ then call parent set. > I can't remember how exactly I did it since I left the company that I used it for. But the way I did it is I override **setattr** (again not 100% sure I haven't used peewee & python in a while) with my BaseAuditModel that inherits ndb.Model. Then when a set happens, I check if **originalValue** is None then copy **data** to **originalValue** then call parent set.

Ah that's a good approach. Thanks!
What should I be using for prepared on version 3? I noticed it's not available anymore and I didn't see it in backwards breaking changes docs. I use it to copy the _data now __data__ whenever prepared is called.

Thanks