Django模型在其他模型上的继承';s场
我有以下型号:Django模型在其他模型上的继承';s场,django,django-models,django-orm,django-inheritance,Django,Django Models,Django Orm,Django Inheritance,我有以下型号: 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.F
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)
不,我正在使用带有
涡轮发动机的汽车
的详细视图,但是汽车.engine.speed()
返回100。如何选择合适的课程?这是一个非常有趣的问题,我们在两三年前遇到过同样的问题:
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\u real\u provider().speed()谢谢,这只需要做一些小改动:self.\uuuuu class.\uuuu.get\u subclass()应该是self.\uuuu class.\uuu subclass.\uuu子类和self.class\uu名称应该是self.\uuuuu class.\uu好的,我为您复制、粘贴和概括了,我会编辑我的回答我相信我不需要这个objects=InheritanceManager()
,对吗?是的,我想你不需要这个