2009-05-28 8 views
5

私は2つの一般的な(content_type)参照の間にマッピングテーブルを作成しようとしています。一つは "エージェント"、もう一つは "リソース"です。djangoモデルには2つの汎用(content_type)外部キーがありますか?

だから、私は、一般的な外部キーを作る通常の方法取る:

content_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
resource = generic.GenericForeignKey('content_type', 'object_id') 

をそして、私は2つでモデルを作成してみてください。

agent_content_type = models.ForeignKey(ContentType) 
agent_object_id = models.PositiveIntegerField() 
agent = generic.GenericForeignKey('agent_content_type', 'agent_object_id') 

resource_content_type = models.ForeignKey(ContentType) 
resource_object_id = models.PositiveIntegerField() 
resource = generic.GenericForeignKey('resource_content_type', 'resource_object_id') 

は、しかし、これは今、次のエラーをスローします。

myapp.mymodel:アクセサのためのフィールド 関連分野 'ContentType.mymodel_set' と 'resource_content_type' 衝突。 related_name引数を 'resource_content_type'の 定義に追加します。

そしてエージェントに似ています。

ここでは何が起こっていますか?そして私はどうしたらいいですか? related_name引数を追加 -

歓声

フィル

答えて

10

は、エラーメッセージが何をあなたに伝え何をやってみましたか?

agent_content_type = models.ForeignKey(ContentType, related_name='mymodel_agent') 

編集: それが起こる理由は、あなたが外部キーを定義するたびに、Djangoは自動的にターゲットモデルに逆引き参照を行うための属性を与えることです。デフォルトでは、これに関連テーブルの名前+ が与えられます。articleテーブルのFKがsectionの場合、sectionは逆引き参照のarticle_set属性を取得します。あなたが同じターゲット・モデルで同じモデルのポインティングで2つのFKSを持っている場合

さて、Djangoはしようとすると、衝突につながる、それらを両方foo_set属性を与えます。したがって、related_name属性を手動で設定するように指示するエラーメッセージ。

+0

ありがとうございます。しかし、私は誰かが理由を説明できることを望んでいた。なぜなら、2つの一般的な外部キーがあるにもかかわらず、1つではないにもかかわらず、あいまいさがなぜ現れるのですか – interstar

+0

説明を追加するために編集されます。 –

関連する問題