We wrote our field-diff engine with zero Django imports. It takes two mappings, returns a typed changeset. The framework layer just feeds it model state.
Not purity — testability. No ORM to spin up, and it survives whatever we migrate to next. It's open: github.com/shipmindlabs/model-audit
Where's the line in your codebase between the framework and the thing it's calling?