2009-05-28 11 views
5

Ich versuche, eine Zuordnungstabelle zwischen zwei generischen (content_type) Referenzen, eine für "Agenten" und eine für "Ressourcen" zu erstellen.Django-Modell mit zwei generischen (content_type) Fremdschlüsseln?

Also nehme ich die übliche Art, wie ich einen generischen Fremdschlüssel:

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

Und ich versuche, ein Modell mit zwei zu machen.

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') 

Aber das wirft nun die folgenden Fehler auf:

myapp.mymodel: Accessor für Feld 'resource_content_type' Auseinandersetzungen mit verwandten Bereich 'ContentType.mymodel_set'. Fügen Sie der -Definition für 'resource_content_type' ein Argument related_name hinzu.

Und ähnlich für den Agenten.

Was geht hier vor? Und was soll ich machen?

prost

phil

Antwort

10

Haben Sie versucht zu tun, was die Fehlermeldung Ihnen sagt, zu tun - ein related_name Argument hinzu?

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

Edit: Der Grund, warum es passiert ist, dass jedes Mal, wenn Sie einen Fremdschlüssel zu definieren, automatisch Django dem Zielmodell ein Attribut gibt das Reverse-Lookup zu tun. Standardmäßig gibt es den Namen der zugehörigen Tabelle + - wenn Ihre article Tabelle also einen FK zu section hat, erhält section ein article_set Attribut für die Reverse-Lookup.

Nun, wenn Sie zwei FKs im selben Modell zeigt auf dem gleichen Zielmodell haben, wird Django versuchen und sie beide das foo_set Attribut geben, zu einer Kollision führt. Daher die Fehlermeldung, die Sie anweist, das Attribut related_name manuell festzulegen.

+0

danke, das funktioniert. Aber ich hatte gehofft, dass jemand erklären könnte warum. Oder, warum erscheint die Mehrdeutigkeit, wenn ich zwei generische Fremdschlüssel habe, aber keinen? – interstar

+0

Bearbeitet, um die Erklärung hinzuzufügen. –

Verwandte Themen