モデルを次のように設定したとします。
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"
ジャンゴの継承がどのように機能するのか、少し混乱しているかもしれません。私の意図は"A: C"
、実行時にプログラムを印刷することです(A.b
モデルのインスタンスであるためC
)
multi-table inheritanceについて尋ねているのではないかと思います。ただし、それは必要なサブクラスのインスタンスがわかっている場合のみです。
私がどのように混乱しているかの別の例として、ドキュメントから例を借りたいと思います:
# 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__()
ありません。これは、「通常の」python では発生しないようです。Python は通常、最も継承されていないクラスを自動的に見つけて、そこからオーバーライドされた関数を実行します (B が A のメソッドをオーバーライドすると、B のメソッドが実行されます)。Restaurant.__str__()
Park.__str__()
私の仮定は正しいですか?長い質問で申し訳ありません(明確でない場合は申し訳ありません)。疑問に思っていることをどのように尋ねたらよいかよくわかりません。