2009-05-28 19 views
5

Estoy tratando de crear una tabla de asignación entre dos referencias genéricas (content_type), una para "agentes" y otra para "recursos".modelo django con dos claves foráneas genéricas (content_type)?

así que tomo la forma habitual hago una clave externa genérica:

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

y trato de hacer un modelo con dos.

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

Pero esto ahora arroja los siguientes errores:

myapp.mymodel: Accessor para el campo enfrentamientos '' resource_content_type con campo relacionado 'ContentType.mymodel_set'. Agregue un argumento related_name a la definición para 'resource_content_type'.

Y similar para el agente.

¿Qué está pasando aquí? ¿Y que debería hacer?

aplausos

Phil

Respuesta

10

¿Ha intentado hacer lo que el mensaje de error que dice que hagamos - añadir un argumento related_name?

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

Editar: La razón por la que ocurre es que cada vez que se define una clave externa, Django da automáticamente el modelo de destino un atributo para hacer la búsqueda inversa. Por defecto, se le da a este el nombre de la tabla relacionada + - por lo que si su mesa article tiene una FK a section, section obtendrá un atributo article_set para la búsqueda inversa.

Ahora bien, si usted tiene dos FKs en el mismo modelo que apunta al mismo modelo de destino, Django tratar de darles tanto el atributo foo_set, lo que lleva a una colisión. De ahí el mensaje de error, que le dice que establezca manualmente el atributo related_name.

+0

gracias, eso funciona. Pero esperaba que alguien pudiera explicar por qué. O más bien, ¿por qué aparece la ambigüedad cuando tengo dos claves externas genéricas pero no una? – interstar

+0

Editado para agregar la explicación. –

Cuestiones relacionadas