mmcnickle solution may work and seems reasonable, but I prefer a two-step process. In the first step, you change the name of the table.
In your model, make sure you have a new table name:
class Meta: db_table = new_table_name'
Then, as mmcnickle suggested, create a custom migration:
python manage.py schemamigration xyz migration_name --empty
You can read more about this here: https://docs.djangoproject.com/en/dev/ref/models/options/
Now with your own migration, also add a line to rename the table back and forth:
db.rename_table("old_table_name","new_table_name")
This may be enough to transfer and change the table name, but if you used the table name of the Meta class tables before that, you will have to work a little. Therefore, I would say, as a rule, just to be safe, search your migration file for "old_table_name" and change all the entries that you find to the name of the new table. For example, if you previously used the table name of the Meta table, you will most likely see:
'Meta': {'object_name': 'ModelNameYouWillChangeNext', 'db_table': "u'old_table_name'"},
So, you will need to change this name of the old table to the new one.
You can now migrate with:
python manage.py migrate xyz
At this point, your application should work, since all you have done is change the name of the table and tell Django to find the new table name.
The second step is to change the name of the model. The difficulty of this really depends on your application, but basically you just need to change all the code that refers to the old model name to the code that refers to the name of the new model. You probably also need to change the file names and directory names if you used your old model name in them for organization purposes.
After that, your application should work fine. At this stage, your task is largely completed, and your application should work fine with the new model name and new table name. The only problem you will encounter in using the south is the next time you create a migration using the auto-discovery feature, it will try to reset the old table and create a new one from scratch because it discovered your new model name. To fix this, you need to create another custom migration:
python manage.py schemamigration xyz tell_south_we_changed_the_model_name_for_old_model_name --empty
It's nice that you are not doing anything here, since you have already changed the name of your model, so South chooses this. Just go with the βpassβ to migrate back and forth:
python manage.py migrate xyz
Nothing has been done, and the South now realizes that it is updated. Try:
python manage.py schemamigration xyz --auto
and you should see that he found that nothing has changed