pythonmysqldatabasedjangoschema-migration

How to move a model between two Django apps (Django 1.7)


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?


Solution

  • I am removing the old answer as may result in data loss. As ozan mentioned, we can create 2 migrations one in each app. The comments below this post refer to my old answer.

    First migration to remove model from 1st app.

    $ python manage.py makemigrations old_app --empty
    

    Edit migration file to include these operations.

    class Migration(migrations.Migration):
    
        database_operations = [migrations.AlterModelTable('TheModel', 'newapp_themodel')]
    
        state_operations = [migrations.DeleteModel('TheModel')]
    
        operations = [
          migrations.SeparateDatabaseAndState(
            database_operations=database_operations,
            state_operations=state_operations)
        ]
    

    Second migration which depends on first migration and create the new table in 2nd app. After moving model code to 2nd app

    $ python manage.py makemigrations new_app 
    

    and edit migration file to something like this.

    class Migration(migrations.Migration):
    
        dependencies = [
            ('old_app', 'above_migration')
        ]
    
        state_operations = [
            migrations.CreateModel(
                name='TheModel',
                fields=[
                    ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ],
                options={
                    'db_table': 'newapp_themodel',
                },
                bases=(models.Model,),
            )
        ]
    
        operations = [
            migrations.SeparateDatabaseAndState(state_operations=state_operations)
        ]