How to move a model between two Django apps (Django 1.7)
change the names of old models to ‘model_name_old’
makemigrations
make new models named ‘model_name_new’ with identical relationships on the related models
(eg. user model now has user.blog_old and user.blog_new)
makemigrations
write a custom migration that migrates all the data to the new model tables
test the hell out of these migrations by comparing backups with new db copies before and after running the migrations
when all is satisfactory, delete the old models
makemigrations
change the new models to the correct name ‘model_name_new’ -> ‘model_name’
test the whole slew of migrations on a staging server
take your production site down for a few minutes in order to run all migrations without users interfering

Do this individually for each model that needs to be moved.
I wouldn’t suggest doing what the other answer says by changing to integers and back to foreign keys
There is a chance that new foreign keys will be different and rows may have different IDs after the migrations and I didn’t want to run any risk of mismatching ids when switching back to foreign keys.
So about a year ago I started a project and like all new developers I didn't really focus too much on the structure, however now I am further along with Django it has started to appear that my project layout mainly my models are horrible in structure.
I have models mainly held in a single app and really most of these models should be in their own individual apps, I did try and resolve this and move them with south however I found it tricky and really difficult due to foreign keys ect.
However due to Django 1.7 and built in support for migrations is there a better way to do this now?