0

私はすでにこのようなモデルを持っています:

class MyBase(models.Model):
    field_a = models.IngetField()
    field_b = models.IngetField()

class Class1(MyBase):
    field_c = models.IngetField()

class Class2(MyBase):
    field_c = models.IngetField()

これは、各 Class1 および Class2 の mybase_ptr_id および field_c フィールドを自動インクリメントすることを意味します。

設計上の理由から、スキーマを次のように変更します。

class Class1(models.Model):
    field_a = models.IngetField()
    field_b = models.IngetField()
    field_c = models.IngetField()

class Class2(models.Model):
    field_a = models.IngetField()
    field_b = models.IngetField()
    field_c = models.IngetField()

代わりに、これは自動インクリメント ID とフィールド field_a、field_b、field_c (私が推測する最も一般的なアプローチ) を必要とします。

テーブルの構造を変更するための確立された、または推奨される方法はありますか? 私はpostgresqlを使用しています。

各テーブルの基本的な方法は次のとおりです。

  1. 新しい ID 列を作成します。
  2. mybase_ptr_id に既にある情報を入力します。
  3. id をシリアルの NOT NULL PRIMARY KEY に変換します。
  4. id の次の値のインデックスを再作成します。
  5. field_a 列と field_b 列を追加します。
  6. MyBase テーブルの field_a、field_b の値に対応する一致。
  7. mybase_ptr_id から列を削除します。

これに関する重要な問題を見逃していますか?みなさんのおすすめを読んでみたい...

4

1 に答える 1

2

一般に、データベース モデルを変更する場合は South を使用することをお勧めします。South はかなり多くのことを自動的に処理できます。

ただし、データを保持しながらこれほど大幅に変更するには、多少の手作業が必要になります。

後でシリアルに変換する必要はないと思いますが、アウトラインはほとんどそこにあると思います。id最初から連載でコラムを作ってもいいと思います。データをコピーした後、主キー インデックスを追加するだけです。

だから...私のアドバイス:

  1. serial id、 field_a 、 field_b を追加し、 field_a と field_b を null フィールドとして追加します。
  2. update table set id = mybase_ptr_id, field_a = other_table.field_a, ...
  3. で開始するようにシーケンスを更新しますselect max(id) from table
  4. 主キーを作成idし、他のフィールドをnullにしない
  5. mybase_ptr_id を削除
于 2013-07-03T23:48:03.747 に答える