djangodjango-south

How to add one to one relation field in a existing model through South migration


I already have a model,

class ModelA( models.Model ):
    name = models.CharField ( max_length = 255, blank = False )

and i have many entries in it. Now i want to add a field in it, which is

user = models.OneToOneField( User )

How do i add this field into ModelA? Is there any solution other than deleting all previous entries?


Solution

  • I would use this pattern:

    1. Add user = models.OneToOneField(User, null=True) to your Model (don't remove the "name" field)
    2. Run manage.py schemamigration --auto. And apply the migration. Now there are two columns in your table.
    3. Now create a datamigration. Edit the file: you need to loop over all objects in your model and set the user field.
    4. Remove the name=models.CharField from the model.py file. And remove the null=True from the user field.
    5. Run manage.py schemamigration --auto. And apply the migration

    BTW, if you use OneToOneField() without null=True, you can set primary_key=True on this field, since it must be unique. But I don't know if south can handle this migration.