2012-07-28 114 views
3

我有以下型号:的Django模型继承

class Engine(models.Model): 
    ... 
    def speed(self): 
     return 100 
    objects = InheritanceManager() 

class TurboEngine(Engine): 
    ... 
    def speed(self): 
     return 500 

class Car(models.Model): 
    ... 
    engine = models.ForeignKey(Engine) 

不,我在Car使用的DetailView与TurboEngine,但car.engine.speed()回报100如何使它选择合适的班级?

回答

3

这是一个非常好的和有兴趣的问题,我们有同样的问题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()速度()

+0

谢谢,这与小的改动作品: 自.__类__ get_subclasses()应该是自.__类__.__子类__() 和self.class_name应该是自.__类__.__ name__ – 2012-07-28 12:50:09

+0

好吧,我复制并粘贴并为你概括,我会编辑我的答案 – Goin 2012-07-28 13:27:42

+0

我相信我赢了' t需要'objects = InheritanceManager()',对吧? – 2012-07-28 15:20:07