6

皆さんにとって良い一日になりますように。タイトルで述べたように、複数のモデルを結合し、そのうちの 1 つを 1 つのグローバル ID で識別したいと考えています。そのため、ID によってモデルが特定され、そのすべてのフィールドにアクセスできます。

現在、私は複数テーブルの継承と戦っていて、問題があります。1 つの親モデルと、親のフィールドの一部を継承する複数の子モデルが必要です。

class Parent(models.Model):
    pass

class Child1(Parent):
    fieldX = models.CharField()

class Child2(Parent):
    fieldY = models.CharField()

ただし、主キーを使用して親モデルで子にアクセスしたいと思います。そう...

Parent.objects.all()

Child1 および Child2 オブジェクトとそのフィールド (fieldX、fieldY) も返す必要があります。

(pk=1 の Parent レコードが Child1 モデルであると仮定します)

親モデルで子フィールドにアクセスしようとすると

child = Parent.objects.get(pk=1)
child.fieldX

django はAttributeError を返します: 'Parent' オブジェクトには属性 'fieldX' がありません

私の目標は、すべての子モデルに対して 1 つの主キーのようなものを作成することです。Djangoでそれは可能ですか?それぞれ、同様の解決策や提案はありますか? contenttypeGUID、UUIDなどの関連トピックを検索してきましたが、それは私が探しているものではないと思います。ご協力ありがとうございました!

4

1 に答える 1

3

作成するParent.objects.get(pk=1)Child1Child2行は問題なく取得されますが、django ORM はParentインスタンスを返します。これは、親テーブルに格納されているデータのみを取得しているためです。

子モデルのインスタンスを取得するには、次のことを行う必要がありますparent_instance.childmodelname

parent.child1複数の子クラスがある場合、親インスタンスがどの子モデルに属しているかを正確に把握してアクセスできるようにする必要があるため、これは非常に簡単に面倒になる可能性があります (たとえば、Child2インスタンスであることにアクセスしようとすると、例外が発生します)。

django-model-utilsアプリを使用することをお勧めします。これは、モデルで使用できるInheritanceManagerというカスタム マネージャーを定義し、対応する子モデル インスタンスを取得して返すことで、プロセス全体をより簡単にします。

于 2013-02-21T01:22:47.863 に答える