18

外部キーフィールド自体を介して外部キーの関連モデルを取得することは可能ですか?

たとえば、3つのモデルがある場合:

class ModelA(models.Model)
    field1 = models.CharField(max_length=10)

class ModelB(models.Model)
    field1 = models.CharField(max_length=10)

class ModelC(models.Model)
    field1 = models.CharField(max_length=10)
    field2 = models.ForeignKey(ModelA)
    field3 = models.ForeignKey(ModelB)

そして私がしたい:

for field in ModelC._meta.fields:
    if field.get_internal_type() == "ForeignKey":
        #get the related model for field e.g. ModelA or ModelB

これは、モデルのインスタンスではなく、モデル自体を使用して可能ですか?

4

2 に答える 2

26

ModelAに「foo」という名前のFKフィールドがある場合、関連するモデルを取得する方法は次のとおりです。

ModelA._meta.get_field('foo').rel.to

コードを使用すると、次のようになります。

for field in ModelC._meta.fields:
    if field.get_internal_type() == "ForeignKey":
        print field.rel.to

ずっと前にシェルでタブ補完を使用してそれを見つけた場合でも、それは機能します。シェルを使用して、そのようなものをリバースエンジニアリングする方法を学びたいと思うかもしれません。

Django>=2.0ユーザー向けのアップデート

構文が変更されました。以下のコードを使用して、関連するモデルを取得します。

ModelA._meta.get_field('foo').related_model
于 2012-04-27T08:29:39.783 に答える
1

このような関係を抽出しようとするとき、私は多くのコマンドライン実験を使用します。私が使用する一般的なパターンはです_=starting_point.<chained_attributes>;pprint((_, dir(_)))。例えば:

_=ModelC;pprint((_, dir(_)))
_=ModelC.field2;pprint((_, dir(_)))
_=ModelC.field2.field;pprint((_, dir(_)))
_=ModelC.field2.field.rel;pprint((_, dir(_)))
_=ModelC.field2.field.rel.to;pprint((_, dir(_)))

(当然、最初に行う必要がありますfrom pprint import pprint。)これにより、必要なアイテムが見つかるまで属性の追加/削除を試すことができます...私が持っているものと次のレベルで利用できるものを明確に確認しながら。これから、私は得 ModelC.field2.field.rel.to == ModelAます。同じ基本パターンを使用して、クラスではなくインスタンスから開始して、逆の関係、多対多の関係などを調べることができます。

于 2014-11-13T19:14:31.307 に答える