2009-05-28 2 views
5

Sto provando a creare una tabella di mapping tra due riferimenti generici (content_type), uno per "agenti" e uno per "risorse".modello django con due chiavi esterne generiche (content_type)?

così prendo il solito modo faccio una chiave esterna generica:

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

e io cerco di fare un modello con due.

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

Ma questo ora getta i seguenti errori:

myapp.mymodel: Accessor per il campo 'resource_content_type' scontri con campo relativo 'ContentType.mymodel_set'. Aggiungi un argomento relativo allo alla definizione per 'resource_content_type'.

E simili per l'agente.

Cosa sta succedendo qui? E cosa dovrei fare?

applausi

phil

risposta

10

Hai provato a fare quello che il messaggio di errore che dice di fare - aggiungere un argomento related_name?

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

Edit: Il motivo per cui accade è che ogni volta che si definisce una chiave esterna, Django dà automaticamente il modello di destinazione un attributo per fare la ricerca inversa. Per impostazione predefinita, assegna a questo il nome della tabella correlata + , quindi se la tabella article ha un FK a section, section otterrà un attributo article_set per la ricerca inversa.

Ora, se si dispone di due FKS nello stesso modello che punta allo stesso modello target, Django cercherà di dare loro sia l'attributo foo_set, portando ad una collisione. Da qui il messaggio di errore, che ti dice di impostare manualmente l'attributo related_name.

+0

grazie, funziona. Ma speravo che qualcuno potesse spiegare il perché. O meglio, perché l'ambiguità appare quando ho due chiavi straniere generiche, ma non una? – interstar

+0

Modificato per aggiungere la spiegazione. –