模型继承 - 如何使用重写方法?

Oha*_*had 4 django django-models

我有以下代码:

   # apps/models.py :

class Parent(models.Model):
    name = models.CharField(max_length=80)

    def __unicode__(self):
        clist = ", ".join([x.__unicode__() for x in self.children.all()])
        return self.name + clist

class Child(models.Model):  
    unit = models.ForeignKey(Parent, related_name='children')
    desc = models.CharField(max_length=80)

    def __unicode__(self):
         return self.desc

class ChildA(Child):
    text = models.TextField()

    def __unicode__(self):
         return self.text[:40]
Run Code Online (Sandbox Code Playgroud)

我有几种类型的物品ChildA.为什么当我要求__unicode__()相关时Parent,我得到的字符串是由__unicode__()方法Child而不是__unicode__()方法生成的字符串ChildA

更新:

这是标准行为.除了以下答案之外,另一种可能的解决方案是继承演员

Chr*_*att 5

这是继承的标准行为.Parent直接与相关的Child,没有ChildA.当你打电话时some_parent.children.all(),你会收到一个Child实例的查询集,所以很明显,当你打电话unicode给其中一个时,它正在调用Child.__unicode__.

UPDATE

从父母到孩子,没有一个好方法.如果你正在使用MTI(多表继承),你可以利用Django实现它的方式,即OneToOneField与父类一样.因此,孩子的父母也存在反向关系,但你必须专门测试它.例如:

class Child(models.Model):
    ...
    def get_child(self):
        if hasattr(self, 'childa'):
            return self.childa
        if hasattr(self, 'childb'):
            return self.childb
        ...
Run Code Online (Sandbox Code Playgroud)

无论如何,它都不是理想的,你需要小心,每当你进行子类化时总是更新这个方法Child,这几乎完全违反了OOP中的抽象.