Hi Shai,
I needed a similar feature in one of my projects.
I have started to use and try to extend the Django collector used in Admin deletion, and finished with something I was not really happy about...
I have then created a full collector (following all relations, foreign keys, manytomany, GFK, ...) named DeepCollector and that I released as django-deep-collector[1] package.
Some parameters allow you to collect some models, excludes other ones, ...
I actively maintain and use it on a daily basis in a big project (300+ tables) to download some production data and load it in my local environment.
I hope this can help!
Romain.