如何通过Django的多表继承允许可覆盖的方法?

时间:2013-01-21 21:15:28

标签: django django-models

我的模型组织如下。

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 ..."

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

但是,在我看来,当我在一般动物上调用make_sound时,Django抱怨Animal个对象没有名为make_sound的方法,这是有意义的,因为只有子类的对象Animal有方法。

我能以某种方式告诉Django我可以保证Animal的子类的所有对象都有make_sound方法吗?通过像Java接口这样的东西?我知道Django文档说“字段名称”隐藏“是不允许的”,但我觉得重写的方法对Django应该支持它的继承至关重要。

我不想具体而且打电话说my_animal.cat.make_sound()因为我想一般地对待动物物品。

2 个答案:

答案 0 :(得分:1)

article提供了一些见解。如果有一种更简单的方法会很方便。 “more efficient technique”看起来很有希望。

答案 1 :(得分:1)

问题不在于Animal不知道make_sound。简单地说,当你在Django中要求一个Animal时,你得到的就是:即使Animal实际上是一个子类而不是基类,也只会返回基本实例。那是因为Django没有尝试查询以查找任何子类表中是否存在相关项 - 这可能是一件好事,因为你会有许多不必要的查询。

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