问题
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?
回答1:
I would do a 3-step migration.
- 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
- 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 aTypingResult
with the corresponding dataLink the
TypingResult
to theTextResult
through FK
2.3 Run the migration to checkpoint
- 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()
来源:https://stackoverflow.com/questions/44146871/migrate-from-one-django-model-to-two-models-referenced-with-a-foreign-key