0

我的模型组织如下。

class Animal(models.Model):

  first_name = models.CharField(max_length=128, unique=True)

class Cat(Animal):

  def make_sound(self):
    return "mreooooow"

class Dog(Animal):

  def make_sound(self):
    return "AARF!"

class EvilMonkey(Animal):

  def make_sound(self):
    return "muahahaha ..."

如您所见,各种动物都继承自一个名为“Animal”的类。每个子类也有一个方法make_sound

但是,在我看来,当我调用make_sound通用动物时,Django 抱怨Animal对象没有方法调用make_sound,这是有道理的,因为只有子类的对象Animal才有方法。

我可以以某种方式告诉 Django,我可以保证子类的所有对象Animal都具有该make_sound方法吗?通过Java接口之类的东西?我知道 Django 文档说“不允许“隐藏”字段名称”,但我觉得覆盖方法对于继承非常重要,因此 Django 应该支持它。

我不想说得特别具体,my_animal.cat.make_sound()因为我想笼统地对待动物对象。

4

2 回答 2

1

问题不在于Animal 不知道make_sound。很简单,当您在 Django 中请求 Animal 时,您会得到:即使该 Animal “实际上”是子类而不是基类,也只会返回基实例。这是因为 Django 不会尝试执行查询来查找任何子类表中是否存在相关项目 - 这可能是一件好事,因为您会有许多不必要的查询。

唯一要做的就是在基类上记录它是什么类型的 Animal,然后编写一个方法从中获取相关的子类。

于 2013-01-21T22:01:15.647 回答
1

本文提供了一些见解。如果有更简单的方法会很方便。“更有效的技术”看起来很有希望。

于 2013-01-21T21:57:45.037 回答