2016-05-03 18 views
2
にDjangoのモデルの親クラスを追加

Django Docsは、マルチテーブル継承を示すために、この例を使用しています。がマルチテーブル継承のための既存のモデルを既存の

from django.db import models 

class Place(models.Model): 
    name = models.CharField(max_length=50) 
    address = models.CharField(max_length=80) 

class Restaurant(Place): 
    serves_hot_dogs = models.BooleanField(default=False) 
    serves_pizza = models.BooleanField(default=False) 

私が最初にそうようにレストランのクラスを構築していた場合:

class Restaurant(models.Model): 
    name = models.CharField(max_length=50) 
    address = models.CharField(max_length=80) 
    serves_hot_dogs = models.BooleanField(default=False) 
    serves_pizza = models.BooleanField(default=False) 

その後、たくさんのRestaurantオブジェクトが既に作成された後、MTIを使用する方が良いとわかりました。実際にデータを移行して親Placeクラスを作成する良い方法はありますか?

+0

コードの可読性やパフォーマンスを向上させる意味はありますか?たぶんあなたはこの投稿を見てください:http://stackoverflow.com/questions/23466577/should-i-avoid-multi-table-concrete-inheritance-in-django-by-any-means – Nirri

+0

私はあまりありませんあなたは親モデルのオブジェクトを持っていたいと思っていて、あなたが使うことができるようにテーブルを作成したくないのなら、あなたの質問について確かめてください。 'class Meta: Abstract = True' – Amar

+0

私は現在の構造をマルチテーブル継承を使用するように移行したいと考えています。たとえば、名前と住所を持つ 'Office'モデルを追加したいと思います。すべてのアドレスを一意にする必要があります。 PlaceクラスとOfficeクラスを追加し、既存のRestaurantデータを移行して新しいデータ構造を使用したいと考えています。 –

答えて

1
  1. 新しいモデルを追加しますが、古いモデルも追加します。 移行を行う

  2. NewRestaurantモデルにRestaurantモデルからデータをコピーするカスタム移行を書きます。

  3. 必要な場合は、RestaurantからNewRestaurantが移行を作るために他のモデルのいずれかの外部キーフィールドを切り替えます。

  4. RestaurantクラスがNewRestaurantクラスを使用するために必要な場合は、アプリ内のどこでも変更してください。

  5. 古いレストランモデルを削除し、マイグレーションを行うを削除します。

  6. 新しいレストランモデルの名前をRestaurantに変更すると、すべて新しい構造で再び機能します。 移行を行う

1

簡単な方法:それを移入、子モデルで<parent_model>_ptrと呼ばれる偽IntegerFieldを作成し、それを削除すると同時に、親モデルを追加します。

ここには完全な記事:http://www.johnborwick.com/blog/2013/08/using-south-to-change-a-django-models-parent-class/があります。それは南についてですが、このアイデアは現代のジャンゴでも機能します。

+0

これを共有していただきありがとうございます。私はこの問題を次回に実行したときにこれを試してみます –

関連する問題