假设我的模型设置如下:
class B(Model):
...
def __str__(self):
return "B"
class C(B):
...
def __str__(self):
return "C"
class A(Model):
b = ForeignKey(B)
def __str__(self):
print "A: %s"%(self.b)
a = A(b=C(...))
a.save()
print str(a) # Prints "A: B"
也许我有点困惑 django 继承是如何工作的。我的意图是让程序"A: C"
在运行时打印(因为A.b
是 model 的一个实例C
)
我想我可能会问多表继承。但这只有在你知道你想要的子类的实例的情况下。
作为我感到困惑的另一个例子,我想从文档中借用这个例子:
# Assume Restaurant, Park, and Museum inherit Place
bills = Restaurant.objects.create(name="Bill's Pub", burger="Bill's Burger")
city_prk = Park.objects.create(name='City Park', num_trails=5)
nose = Museum.objects.create(name='Nose Museum', est=1940)
places = Places.objects.all()
我肯定会得到 3 个对象(类型Place
)的列表,但我无法区分地点的类型。例如,如果我想打印出每个地方的 str 值......
for place in places:
print str(place)
...python 只会执行Place.__str__()
而不是Restaurant.__str__()
(对于餐厅)或Park.__str__()
(对于公园)。“普通”python似乎不会发生这种情况。Python 通常应该自动找到最低继承的类并从中执行被覆盖的函数(如果 B 覆盖了 A 的方法,则将执行 B 的方法)。
我的假设正确吗?很抱歉这个问题很长(如果不清楚,很抱歉)。我不完全确定如何问我在想什么。