Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型在其他模型上的继承';s场_Django_Django Models_Django Orm_Django Inheritance - Fatal编程技术网

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()
,对吗?是的,我想你不需要这个