我的模型组织如下。
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()
因为我想一般地对待动物物品。
答案 0 :(得分:1)
此article提供了一些见解。如果有一种更简单的方法会很方便。 “more efficient technique”看起来很有希望。
答案 1 :(得分:1)
问题不在于Animal不知道make_sound。简单地说,当你在Django中要求一个Animal时,你得到的就是:即使Animal实际上是一个子类而不是基类,也只会返回基本实例。那是因为Django没有尝试查询以查找任何子类表中是否存在相关项 - 这可能是一件好事,因为你会有许多不必要的查询。
唯一要做的就是记录它在基类上的动物类型,然后编写一个方法来从中获取相关的子类。