Reputation: 550
I need to outsource some of the attribues in the following Django model:
class TextResult(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
text = models.ForeignKey(Text)
# following fields will be in the referenced model
wpm = models.FloatField(default=0.0)
accuracy = models.FloatField(default=1.0,
validators=[MinValueValidator(0.0),
MaxValueValidator(1.0)])
to a model, that references to the specific data:
class TextResult(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
text = models.ForeignKey(Text)
typing_result = models.ForeignKey(TypingResult)
class TypingResult(models.Model):
wpm = models.FloatField(default=0.0)
accuracy = models.FloatField(default=1.0,
validators=[MinValueValidator(0.0),
MaxValueValidator(1.0)])
The problem is, that there is already some data in the database, so I have to migrate the data to the new structure, what is the easiest, cleanest way to achieve that?
Upvotes: 0
Views: 763
Reputation: 3664
I would do a 3-step migration.
1.1. Create TypingResult
model and the typing_result = models.ForeignKey(TypingResult, blank=True, null=True)
field. Make sure the FK is optional by making it blank-able and null-able
1.2 Checkpoint by migrating
2.1 Create an empty migration using this guide https://docs.djangoproject.com/en/1.11/topics/migrations/#data-migrations and add instructions for data migrations.
2.2 The data migration steps are as follows:
Iterate through all TextResult
for each of them create a TypingResult
with the corresponding data
Link the TypingResult
to the TextResult
through FK
2.3 Run the migration to checkpoint
3.1 Delete the wpm and accuracy fields on the TextResult
and make the ForeignKey non-optional.
3.2 Run the migration
Conclusion
This can probably all be done in 1 step, but it's best to understand what is going on. Also adding pdb before a .save()
call will allow you to inspect the steps for the data migration
import pdb; pdb.set_trace()
Upvotes: 1