Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
197 views
in Technique[技术] by (71.8m points)

python - Migrate from one django model to two models referenced with a foreign key

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I would do a 3-step migration.

  1. Create the new fields

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

  1. Data Migration

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

  1. Cleanup

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()

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...