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?
更新:
这是标准行为.除了以下答案之外,另一种可能的解决方案是继承演员
这是继承的标准行为.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中的抽象.