2012-03-22 6 views
20

Estoy usando multi-table-inheritance, y quiero saber cómo crear un tipo heredado a partir de una instancia de la superclase.Herencia de modelo de Django: cree una subclase utilizando la superclase existente

Usando el ejemplo dado en la documentación:

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

Ahora cuando se crea un Restaurant, automáticamente hacer un Place, que está bien, y el comportamiento que esperan y desean.

Pero, ¿y si hago un Place, y luego decido que quiero convertir a un tipo específico (como Restaurant). ¿Cómo se crea un Restaurant, utilizando un Place existente?

+3

posible duplicado de [modelo de herencia Django:? Crear sub-instancia de instancia (abatido) existente] (http://stackoverflow.com/questions/4064808/django-model-inheritance-create- sub-instance-of-existing-instance-downcast) – jpic

+0

Vi esa pregunta y respuesta, pero estaba confundido porque pensé que el problema tenía que ver con la autenticación (porque un usuario es un objeto más de un objeto especial) –

+0

He subido la apuesta Sin embargo, la observación de duplicación ... la pregunta que se refiere es sobre los usuarios, lo que puede ser confuso. Encuentro este ejemplo de lugares y restaurantes (robados de las Documentaciones de Django) más claro y se asemeja a mi problema ... pero en la base es el mismo problema. –

Respuesta

26

herencia de múltiples tablas es solo OneToOneField relación entre el lugar y el restaurante.

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

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

Esto causará que restaurant.name se vacíe. Porque restaurant.save() actualizará el Lugar con name = '' (porque restaurant = Resturant()) ... debe haber una mejor manera ... – jpic

+10

Deberías agregar restaurant .__ dict __. Update (place .__ dict__), ver [la respuesta de Daniel Roseman] (http://stackoverflow.com/questions/4064808/django-model-inheritance-create-sub-instance-of-existing-instance-downcast). – jpic

+1

Ok, la combinación de la respuesta de secator y la adición de jpic hacen el truco ... –

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

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