The Autodetector¶
The autodetector is the part of South you’ll probably be using the most, as well as being the feature that people seem to like the most.
The general use of the autodetector is covered in Part 1: The Basics; this is more of a reference of what it’s capable of.
When the autodetector runs, it compares your current models with those frozen in your most recent migration on the app, and if it finds any changes, yields one or more Actions to the South migration-file-writer.
Supported Actions¶
Model creation and deletion¶
South will happily detect the creation and deletion of models; this is the oldest and most well-worn feature of the autodetector, and so has very few caveats.
One thing to note is that, while South calls the post_syncdb hook on your
models (much like syncdb
does), it calls it when it initially creates the
table, not at the end of the migration, so your hook might well get called
when the model doesn’t have its full table.
Consider moving your hook code into its own data migration, or use one of our own Signals.
Field addition and removal¶
South detects addition and removal of fields fine, and should correctly create indexes and constraints for new fields.
Note that when you add or remove a field, you need a default specified; there’s more explanation on this in the Defaults part of the tutorial.
Field changes¶
South will detect if you change a field, and should correctly change the field type, with one exception:
- If you alter to a field with a CHECK constraint (e.g.
PositiveIntegerField
) the constraint won’t be added to the column (it is removed if you alter away, however). This will be fixed in a future release.
ManyToMany addition and removal¶
ManyToMany fields are detected on addition and removal; when you add the field, South will create the table the ManyToMany represents, and when you remove the field, the table will be deleted.
The one exception to this is when you have a ‘through model’ (i.e. you’re using
the through=
option) - since the table for the model is already created when
the model is detected, South does nothing with these types of ManyToMany fields.
Unique changes¶
If you change the unique=
attribute on a field, or the unique_together
in a model’s Meta, South will detect and change the constraints on the database
accordingly (except on SQLite, where we don’t yet have the code to edit UNIQUE
constraints).
Multicolumn index changes¶
Django 1.5 introduced index_together
in a model’s Meta, allowing you to
specify multicolumn indexes. South will detect and change the indexes on the
database accordingly.