ほとんどの場合、オブジェクトには自然な階層があります。場合によってはある種の「マスター」があり、他のすべてのオブジェクトには、このマスターと外部キーに対する外部キー(FK)の参照があります。
この場合、各マスターオブジェクトに多数の補助オブジェクトを「含む」XML形式の構造を使用できます。この場合、最初にマスターを挿入し、すべての子に既存のオブジェクトへのFK参照があります。
しかし、場合によっては、既存のオブジェクトに対して単純なFKではないリレーションシップがあります。この場合、循環依存があり、(1)この依存関係を一時的に中断し、(2)オブジェクトがロードされた後に依存関係を再作成する必要があります。
これは、(a)オプションのFKを持つようにモデルを定義し、(b)一時的な "ナチュラルキー"参照を持つことによって行います。適切なFKなしでデータをロードします(オプションです)。
次に、データがロードされた後、2番目のパスに戻り、見つからないFK参照をすべて挿入します。これが完了したら、モデルを修正してFKを必須にすることができます。
プログラム1 - 古いデータベースから単純なフラットファイルにエクスポートします。 CSV形式またはJSON形式または何か簡単です。
for m in OldModel.objects.all():
aDict = { 'col1':m.col1, 'old_at_fk':m.fktoanothertable.id, 'old_id':id }
csvwriter.writerow(aDict)
プログラム2 - 単純なフラットファイルを読み込みます。新しいデータベースモデルオブジェクトを構築する。
# Pass 1 - raw load
for row in csv.reader:
new= NewModel.create(**row)
# Pass 2 - resolve FK's
for nm in NewModel.objects.all():
ref1= OtherModel.objects.get(old_id=nm.old_at_fk)
nm.properfk = ref1
nm.save()
23Mbプログラムのスニペットを投稿できますか? –
私は、コードが非常に非効率的であることを知りました。私は関数を使用してそれを小さくしようとしています! –
データを読み込んでDjangoモデルオブジェクトを作成するための小さなプログラムを書くのではなく、データを大量のコードに変換した理由を説明できますか? –