2017-05-25 2 views
0

私はたとえば以下の、私は指定されたモデルに基づいて一般化モデルを必要とすることに、気づいたが、私が何を意味するか示す必要があります:ジャンゴ:より一般的なモデルを継承したモデルのプロパティを外部委託

前:

class TextResult(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 
    text = models.ForeignKey(Text) 
    wpm = models.FloatField(default=0.0) 
    accuracy = models.FloatField(default=1.0) 

class TypingResult(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 
    wpm = models.FloatField(default=0.0) 
    accuracy = models.FloatField(default=1.0) 


class TextResult(TypingResult): 
    text = models.ForeignKey(Text) 

新しいmodelstructureへデータを移行する必要があるので、元のモデルでは、いくつかのデータは、すでにありますが

答えて

0

次の答えは、この回答に基づいている(https://stackoverflow.com/a/44148102/4129587

は、以下の5つの基本的な移行手順は、所望の結果につながる手動によるデータ移行を行うことが必要であることを達成するために

  1. TypingResult
  2. は、古いモデルの新モデルTypingResultにNULL可能である新しい外部キーを作成して新しいモデルを作成TextResult
  3. TypingResult
  4. が新しい主キー

として外部キーを変更し、元のモデル

  • からIDを含む古い属性を削除し、新たなモデルの新しいインスタンスにすべての古い属性をコピーします

    次のコードは自動的に生成された移行に基づいており、既にテスト済みです

    from __future__ import unicode_literals 
    
    from django.conf import settings 
    import django.core.validators 
    from django.db import migrations, models 
    import django.db.models.deletion 
    
    def copy_text_results_to_typing_results(apps, schema_editor): 
        TypingResult = apps.get_model('testapp', 'TypingResult') 
        TextResult = apps.get_model('testapp', 'TextResult') 
        for text_result in TextResult.objects.all(): 
         copied_result = TypingResult() 
         copied_result.user = text_result.user 
         copied_result.wpm = text_result.wpm 
         copied_result.accuracy = text_result.accuracy 
         copied_result.save() 
         text_result.typingresult_ptr = copied_result 
         text_result.save() 
    
    class Migration(migrations.Migration): 
    
        dependencies = [ 
         migrations.swappable_dependency(settings.AUTH_USER_MODEL), 
         ('testapp', '0001_initial'), 
        ] 
    
        operations = [ 
         migrations.CreateModel(
          name='TypingResult', 
          fields=[ 
           ('id', models.AutoField(auto_created=True, 
                 primary_key=True, 
                 serialize=False, 
                 verbose_name='ID')), 
           ('wpm', models.FloatField(default=0.0)), 
           ('accuracy', models.FloatField(default=1.0)), 
           ('user', models.ForeignKey(default=1, 
                  on_delete=django.db.models.deletion.CASCADE, 
                  to=settings.AUTH_USER_MODEL)), 
          ], 
         ), 
         # add the foreign key for the new inherited model, 
         # it is allowed to have null values since the actual values have to be 
         # copied first to this, it will be changed later 
         migrations.AddField(
          model_name='textresult', 
          name='typingresult_ptr', 
          field=models.OneToOneField(blank=True, null=True, to='testapp.TypingResult'), 
         ), 
         # copy the old values to the new inherited model 
         migrations.RunPython(copy_text_results_to_typing_results), 
         # remove the old id and the copied fields from the TextResult model 
         migrations.RemoveField(
          model_name='textresult', 
          name='accuracy', 
         ), 
         migrations.RemoveField(
          model_name='textresult', 
          name='id', 
         ), 
         migrations.RemoveField(
          model_name='textresult', 
          name='user', 
         ), 
         migrations.RemoveField(
          model_name='textresult', 
          name='wpm', 
         ), 
         # alter the id of the inherited model to be the new primary key 
         migrations.AlterField(
          model_name='textresult', 
          name='typingresult_ptr', 
          field=models.OneToOneField(auto_created=True, 
                 on_delete=django.db.models.deletion.CASCADE, 
                 parent_link=True, 
                 primary_key=True, 
                 serialize=False, 
                 to='testapp.TypingResult'), 
         ), 
        ] 
    
  • 関連する問題