Estoy tratando de encontrar la clase real de un objeto django-model, cuando uso la herencia del modelo.¿Cómo puedo encontrar la "clase concreta" de una clase base del modelo django?
algo de código para describir el problema:
class Base(models.model):
def basemethod(self):
...
class Child_1(Base):
pass
class Child_2(Base):
pass
Si creo diversos objetos de las dos clases de niño y el crear un conjunto de consultas que contiene a todos ellos:
Child_1().save()
Child_2().save()
(o1, o2) = Base.objects.all()
quiero para determinar si el objeto es de tipo Child_1 o Child_2 en basemethod; puedo acceder al objeto hijo mediante o1.child_1 y o2.child_2 pero eso reconquista el conocimiento sobre las clases de niños en la clase base.
he llegado con el siguiente código:
def concrete_instance(self):
instance = None
for subclass in self._meta.get_all_related_objects():
acc_name = subclass.get_accessor_name()
try:
instance = self.__getattribute__(acc_name)
return instance
except Exception, e:
pass
pero se siente frágil y no estoy seguro de lo que sucede cuando si heredo en más niveles.
Gracias, eso resolvió mi problema –
No sé si es porque estoy en django 1.4, pero esto no funcionó para mí hasta que usé 'if (no self.content_type_id)' en lugar de self.content_type. aparentemente Django estaba intentando cargar self.content_type, lo que resultó en 'DoesNotExist' –
AFAIK esto es exactamente lo que hace este paquete: https://django-polymorphic.readthedocs.org/en/latest/ Devuelve la clase de niño concreta incluso si utiliza BaseClass.objects.filter() – guettli