2012-03-22 26 views
20

kullanarak bir alt sınıf oluşturun multi-table-inheritance kullanıyorum ve süper sınıfın bir örneğinden miras alınan bir türün nasıl oluşturulacağını öğrenmek istiyorum. Bir Restaurant oluştururken ince bir Place yapmak otomatik, ŞimdiDjango modeli devralma: Mevcut süper sınıf

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() 

ve davranış beklediğim ve istiyorum:

belgelerinde verilen örneği kullanarak.

Peki ya bir Place yaparsam ve daha sonra belirli bir türe (Restaurant gibi) dönüştürmek istediğime karar verirsem. Mevcut bir Place kullanarak, Restaurant nasıl oluşturulur?

+3

olası yinelenen [Django modeli devralma:? (Mahzun) örneği mevcut alt örneğini oluşturmak] (http://stackoverflow.com/questions/4064808/django-model-inheritance-create- alt-örnek-varolan-örnek-downcast) – jpic

+0

Bu soru ve cevabı gördüm, ama kafam karışmıştı çünkü sorunun kimlik doğrulamasıyla yapıldığını düşündüm (çünkü bir Kullanıcı biraz daha özel bir nesne olduğundan) –

+0

Yineleme söz konusu olsa da ... ... atıfta bulunulan soru, kafa karıştırıcı olabilecek kullanıcılar hakkındadır. Bu yeri ve restoranları (Django Documentations'dan çalınmış) daha net ve problemimi andıran bir örnek buluyorum .... ama temelde aynı problem. –

cevap

26

Yer ve Restoran arasında çok masalı kalıtım yalnızca OneToOneField ilişkisidir.

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

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

Bu, restaurant.name dosyasının boşalmasına neden olur. Restaurant.save() ismini Place = '' (restoran = Resturant()) ile güncelleyeceği için ... daha iyi bir yol olmalı. ... – jpic

+10

Eğer restaurant .__ dict __. Update (place .__ dict__) 'i eklemelisiniz. [Daniel Roseman'ın cevabı] 'na bakın (http://stackoverflow.com/questions/4064808/django-model-inheritance-create-sub-instance-of-existing-instance-downcast). – jpic

+1

Tamam, senatörün cevabının ve jpic'in eklenmesinin kombinasyonu ... –

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

# Create a restaurant using existing Place 
place.__class__ = Restaurant 
place.save() 
restaurant = place 
ait