0

モデルを次のように設定したとします。

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__()

私の仮定は正しいですか?長い質問で申し訳ありません(明確でない場合は申し訳ありません)。疑問に思っていることをどのように尋ねたらよいかよくわかりません。

4

2 に答える 2

0

実際、さらに調査を行った結果、私が探していたのは「ポリモーフィック」アプリであることがわかりました。https ://github.com/bconstantin/django_polymorphic

于 2014-01-14T01:36:37.313 に答える
0

ほとんどの python オブジェクトがそのように機能することは正しいですが、django モデルはそうではありません。マルチテーブル継承を行っています。これにより、親テーブル - B と子テーブル - C が作成されます。C には、B.id の外部キーでもある b_ptr_id という名前の主キーがあります。A には B への外部キーが含まれているため、それが得られます。次のように子オブジェクトを参照できます。

b_object = B.objects.get(…)
c_object = b_object.c

しかし、もちろん、複数のテーブルが B から継承された場合、どの子オブジェクトを抽出するかはわかりません。このユーティリティが役立つかもしれません: https://django-model-utils.readthedocs.org/en/latest/managers.html#inheritancemanager必要なことだけを行います。クエリ セットを呼び出す.select_subclasses()と、各オブジェクトが「実際の」子オブジェクトに自動的に「キャスト」されます。

于 2013-09-15T01:42:09.990 に答える