gpt4 book ai didi

django - 模型继承 - 如何使用被覆盖的方法?

转载 作者:行者123 更新时间:2023-12-05 01:31:14 25 4
gpt4 key购买 nike

我有以下代码:

   # 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]

我有几个 ChildA 类型的项目.为什么当我要求 __unicode__()相关的 Parent ,我得到的字符串是由 __unicode__() 生成的。 Child的方法而不是 __unicode__() ChildA的方法?

更新:

这是标准行为。除了以下答案之外,另一种可能的解决方案是 inheritance cast

最佳答案

这是继承的标准行为。 ParentChild 直接相关,而不是 ChildA .当您调用 some_parent.children.all() , 你会得到一个 Child 的查询集很明显,当您调用 unicode 时在其中一个上,它正在调用 Child.__unicode__ .

更新

从 parent 到 child 并没有真正的好方法。如果您使用 MTI(多表继承),您可以利用 Django 实现它的方式,即作为 OneToOneField与 parent 。因此, parent 与 child 之间也存在反向关系,但您必须专门对其进行测试。例如:

class Child(models.Model):
...
def get_child(self):
if hasattr(self, 'childa'):
return self.childa
if hasattr(self, 'childb'):
return self.childb
...

无论如何,这并不理想,并且您需要小心在子类 Child 时始终更新此方法,这几乎完全违反了 OOP 中的抽象。

关于django - 模型继承 - 如何使用被覆盖的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9771180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com