How to migrate using south.
Lets say we got two apps: common and specific:
myproject/
|-- common
| |-- migrations
| | |-- 0001_initial.py
| | `-- 0002_create_cat.py
| `-- models.py
`-- specific
|-- migrations
| |-- 0001_initial.py
| `-- 0002_create_dog.py
`-- models.py
Now we want to move model common.models.cat to specific app (precisely to specific.models.cat).
We do it in the source code and run:
$ python manage.py startmigration specific create_cat --auto
+ Added model 'specific.cat'
$ python manage.py startmigration common drop_cat --auto
- Deleted model 'common.cat'
myproject/
|-- common
| |-- migrations
| | |-- 0001_initial.py
| | |-- 0002_create_cat.py
| | `-- 0003_drop_cat.py
| `-- models.py
`-- specific
|-- migrations
| |-- 0001_initial.py
| |-- 0002_create_dog.py
| `-- 0003_create_cat.py
`-- models.py
Now we need to edit moth migration files:
#0003_create_cat: replace existing forward and backward code to use just one sentence:
def forwards(self, orm):
db.rename_table('common_cat', 'specific_cat')
def backwards(self, orm):
db.rename_table('specific_cat', 'common_cat')
#0003_drop_cat:replace existing forward and backward code to use just one sentence; add dependency:
depends_on = (
('specific', '0003_create_cat'),
)
def forwards(self, orm):
pass
def backwards(self, orm):
pass
Now both apps migrations are aware of the change and life sucks just a little less :-)
Setting this relationship between migrations is key of success.
Now if you do:
python manage.py migrate common
> specific: 0003_create_cat
> common: 0003_drop_cat
will do both migration, and
python manage.py migrate specific 0002_create_dog
< common: 0003_drop_cat
< specific: 0003_create_cat
will migrate things down.
Notice that for uprading of schema I used common app and for downgrading, I used specific app. That's because how the dependency here works.