2017-05-09 3 views
0

私は自分のデータベースのスキーマを大きく変更していますが、新しいスキーマに移行する過程でデータを失いたくはありません。具体的な例を挙げておきます。私は現在class Person(models.Model)を持っていて、それぞれPersonインスタンスには、name,ageなどのようなデータの束があります。データベースにはすでにPersonのインスタンスがたくさんあります。実際にはPersonStudentTeacherという2つのタイプが必要であり、これらのタイプにはそれぞれ固有の変数とメソッドが必要です。これを達成する最良の方法は、Personを抽象クラスにして、StudentTeacherをそのクラスに拡張することです。 Personの変数の一部は現在Studentにのみ適用されていますので、これらの変数をStudentサブクラスに移動します。どのようにデータを失うことなくDjangoデータベーススキーマを完全に変更できますか?

通常、データを失うことなくこの移行を実行するにはどうすればよいですか?私はDjangoをかなり新しくしているので、どこから始めるべきか分からないので、おそらくpython manage.pyで実行するカスタムスクリプトを書く必要があります。

+0

また、選択肢とともにperson_typeフィールドを追加することもできます。 https://docs.djangoproject.com/en/1.11/ref/models/fields/#choices – iamkhush

+0

このアプローチの問題点は、私がしたいことが本当にサブクラス化に役立つということです。なぜなら、「Student」と「Teacher」はそれぞれ独自の別々の変数とメソッドだけでなく、多くの共有変数も含んでいます。 「教師」がGPAを持つのは意味がありませんが、「学生」と「教師」の両方に姓があります。これは単なる一例です。 – Solomon

+0

もしあなたがpostgresを使っているなら、hstorefieldを使っていくつかのレベルの柔軟性を調べることができます。 – iankit

答えて

3

あなたが探しているものは、Django data migrationsです。

  1. 人メタモデル
  2. があなたのStudentTeacherモデルを追加し、それらをPerson
  3. 実行manage.py makemigrations
  4. 結果の移行があなたの新しいモデルを追加操作を持っているとPersonを削除しますから継承する必要があり、あなたにabstract = Trueを追加。カスタムデータ移行操作は、作成後、削除前に行う必要があります。 Personモデルの名前フィールドを移行するDjangoのドキュメントの例に従ってください。代わりに、それぞれの人物に対して新しいStudentTeacherモデルのインスタンスを作成してください。新しいインスタンスは必ず保存してください。

その他のヒント:

  1. 使用fixturesバックアップにあなたのデータを使えば、簡単にあなたはあなたの新しい特別な名前を変更するのが賢明だろう移行
  2. 中にミスをした場合に にそれを復元することができるように将来的にあなたが容易に識別できるようにするためのマイグレーション
+0

これは私にとってはうまくいくようです。ありがとう! – Solomon

関連する問題