这是一个非常好的和有兴趣的问题,我们有同样的问题2或3年前:
class RealInstaceProvider(object):
def get_real_instance(self):
"""
Makes a SQL sentence which does the JOIN with its real model class
"""
if hasattr(self, '_real_instance'): # try looking in our cache
return self._real_instance
subclasses = self.__class__.__subclasses__()
if not subclasses: # already real_instance
real_instance = getattr(self, self.__class__.__name__, self)
self._real_instance = real_instance
return real_instance
else:
subclasses_names = [cls.__name__.lower() for cls in subclasses]
for subcls_name in subclasses_names:
if hasattr(self, subcls_name):
self._real_instance = getattr(self, subcls_name, self).get_real_instance()
return self._real_instance
self._real_instance = self
return self
class Engine(models.Model, RealInstaceProvider):
...
def speed(self):
return 100
objects = InheritanceManager()
class TurboEngine(Engine):
...
def speed(self):
return 500
class Car(models.Model):
...
engine = models.ForeignKey(Engine)
而且你必须到下一个方式访问:car.engine.get_real_provider()速度()
谢谢,这与小的改动作品: 自.__类__ get_subclasses()应该是自.__类__.__子类__() 和self.class_name应该是自.__类__.__ name__ – 2012-07-28 12:50:09
好吧,我复制并粘贴并为你概括,我会编辑我的答案 – Goin 2012-07-28 13:27:42
我相信我赢了' t需要'objects = InheritanceManager()',对吧? – 2012-07-28 15:20:07