How do I find the "concrete class" of a django model baseclass

Posted by Mr Shark on Stack Overflow See other posts from Stack Overflow or by Mr Shark
Published on 2008-12-08T11:11:45Z Indexed on 2010/05/29 19:22 UTC
Read the original article Hit count: 279

I'm trying to find the actual class of a django-model object, when using model-inheritance.

Some code to describe the problem:

class Base(models.model):
    def basemethod(self):
        ...

class Child_1(Base):
    pass

class Child_2(Base):
    pass

If I create various objects of the two Child classes and the create a queryset containing them all:

Child_1().save()
Child_2().save()
(o1, o2) = Base.objects.all()

I want to determine if the object is of type Child_1 or Child_2 in basemethod, I can get to the child object via o1.child_1 and o2.child_2 but that reconquers knowledge about the childclasses in the baseclass.

I have come up with the following code:

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

But it feels brittle and I'm not sure of what happens when if I inherit in more levels.

© Stack Overflow or respective owner

Related posts about python

Related posts about django