2012-03-22 14 views
20

私はmulti-table-inheritanceを使用しています。スーパークラスのインスタンスから継承型を作成する方法を知りたいです。あなたがRestaurantを作成するとき、あなたは大丈夫ですPlaceを作る自動的に、今Djangoモデルの継承:既存のスーパークラスを使用してサブクラスを作成する

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

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

、および行動は、私は期待したい:

ドキュメントに与えられた例を使用します。

しかし、Placeを作成してから、特定のタイプ(Restaurantなど)に変換したい場合はどうすればよいですか。既存のPlaceを使用してRestaurantを作成するにはどうすればよいですか?

+3

の可能重複[Djangoのモデル継承:(ダウンキャスト)は、既存のインスタンスのサブインスタンスを作成しますか?](http://stackoverflow.com/questions/4064808/django-model-inheritance-create- sub-instance-instance-downcast) – jpic

+0

私はその質問と答えを見ましたが、問題は認証と関係していると思ったので混乱しました(ユーザはもう少し特殊なオブジェクトなので) –

+0

私はあなたをアップしましたしかし、重複の発言は、参照している質問はユーザーについてのもので、紛らわしいかもしれません。私はこの場所とレストラン(Django Documentationsから盗まれたもの)の例がより明確で、私の問題に似ていることを発見しました....しかし、根本的には同じ問題です。 –

答えて

26

複数テーブルの継承は、プレイスとレストランの間のちょうどOneToOneFieldの関係です。

place = Place.objects.get(id=1)    

# Create a restaurant using existing Place 
restaurant = Resturant(place_ptr=place) 
restaurant.save() 
+9

を参照してください。これにより、restaurant.nameが空になります。レストラン= Resturant()のために、restaurant.save()は名前= ''でプレイスを更新するので...より良い方法が必要です... – jpic

+10

レストランを追加する必要があります.____ dict__。update(place .__ dict__) [Daniel Rosemanの答え](http://stackoverflow.com/questions/4064808/django-model-inheritance-create-sub-instance-of-existing-instance-downcast)を参照してください。 – jpic

+1

OK、secatorの回答とjpicの追加の組み合わせがトリックを行います... –

9
place = Place.objects.get(id=1) 

# Create a restaurant using existing Place 
place.__class__ = Restaurant 
place.save() 
restaurant = place 
関連する問題