2012-03-22 10 views
20

Sto utilizzando multi-table-inheritance e voglio sapere come creare un tipo ereditato da un'istanza della superclasse.Ereditarietà modello Django: creare una sottoclasse utilizzando la super classe esistente

Usando l'esempio indicato nella documentazione:

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

Ora, quando si crea un Restaurant, è automaticamente fare un Place, che va bene, e il comportamento che si aspettano e vogliono.

Ma cosa succede se faccio un Place e successivamente decido che voglio convertire in un tipo specifico (come Restaurant). Come si crea un Restaurant, utilizzando uno esistente Place?

+3

possibile duplicato del [modello di ereditarietà Django: creare sotto-istanza di esempio (bassi) esistente] (http://stackoverflow.com/questions/4064808/django-model-inheritance-create- sub-instance-of-existing-downcast dell'istanza) – jpic

+0

Ho visto quella domanda e risposta, ma ero confuso perché pensavo che il problema riguardasse l'autenticazione (perché un utente è un po 'più di un oggetto speciale) –

+0

ho upvoted il tuo osservazione di duplicazione, tuttavia ... la domanda a cui si fa riferimento riguarda gli utenti, il che potrebbe essere fonte di confusione. Trovo questo esempio di luoghi e ristoranti (rubati dalle Documentazioni Django) più chiari e simili al mio problema ... ma in base è lo stesso problema. –

risposta

26

L'ereditarietà multi tavolo è solo la relazione OneToOneField tra il luogo e il ristorante.

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

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

Ciò causerà lo svuotamento di restaurant.name. Perché restaurant.save() aggiorna il posto con nome = '' (perché restaurant = Resturant()) ... ci deve essere un modo migliore ... – jpic

+10

È necessario aggiungere ristorante .__ dict __. Aggiornamento (luogo .__ dict__), vedere [risposta di Daniel Roseman] (http://stackoverflow.com/questions/4064808/django-model-inheritance-create-sub-instance-of-existing-instance-downcast). – jpic

+1

Ok, la combinazione della risposta di secatore e aggiunta di jpic fa il trucco ... –

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

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