2012-04-27 18 views
13

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

、私は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 

ではなくモデルのインスタンスよりも、単にモデルそのものを使用して、このことは可能ですか?

答えて

19

MODELAが "foo" という名前のFKフィールドを持っている場合、これはあなたが関連するモデル得ることができる方法である。場合

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

:あなたのコードで

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

を、それは次のようになります。それは昔のシェルでタブ補完を使って見つけ出しましたが、それでも動作します。あなたはそのようなものをリバースエンジニアリングするためにシェルを使用する方法を学ぶことができます。

+0

更新:新しくリリースされたDjango 2.0では、 "rel"はもはや見えませんForeignKeyのフィールド。 'ModelA._meta.get_field( 'foo')。related_model'を試すことができます。私はコマンドラインで自動的に完了するために "タブ"を入力してこれを把握します。 –

0

このような関係を抽出しようとすると、私は多くのコマンドライン実験を行います。私が使用する一般的なパターンは_=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を得る。リバースリレーションシップ、多対多リレーションシップ、クラスではなくインスタンスで始まる同じベースパターンを使用することができます。

関連する問題