2009-02-24 6 views
33

quería un modelo de Django con 2 llaves extranjeras de la misma tabla. Es una tabla de eventos que tiene 2 columnas para empleados: el 'actor' y el 'receptor'. Pero me sale este error:modelo de Django con 2 llaves extranjeras de la misma tabla

Error: One or more models did not validate: tasks.task: Intermediary model TaskEvent has more than one foreign key to Employee, which is ambiguous and is not permitted.

¿Hay una mejor manera de modelar esto? Gracias

Creo que voy a agregar una tabla TaskEvent_to_Employee. Habrá dos registros, uno para cada uno de los dos empleados relacionados con cada TaskEvent. ¿Alguien sabe una solución más fácil?

+0

¿Puede proporcionar las clases de modelo que le están dando este problema? –

+2

posible duplicado de [¿Cómo puedo tener dos claves ajenas al mismo modelo de Django?] (Http://stackoverflow.com/questions/543377/how-can-i-have-two-foreign-keys-to-the -La misma-modelo-en-django) –

+1

duplicado posible de [¿Cómo puedo tener dos claves ajenas al mismo modelo de Django?] (https://stackoverflow.com/questions/543377/how-can-i-have- two-foreign-keys-to-the-same-model-in-django) –

Respuesta

56

no he hecho todavía, pero se usa inspectdb para generar el archivo models.py desde una base de datos existente que hace exactamente eso - esto es lo que inspectdb echó hacia atrás, por lo que debería funcionar:

creator = models.ForeignKey(Users, null=True, related_name='creator') 
assignee = models.ForeignKey(Users, null=True, related_name='assignee') 

la esperanza de que funcione para usted - si no es así que voy a tener un problema también.

+2

Buena suerte con el problema que vas a tener entonces. : P – Josh

+4

En realidad - que funciona muy bien ... –

+9

No es related_name el enlace de vuelta al modelo que contiene el atributo mediante 'related_name', por lo que en el ejemplo anterior ejemplo ¿no cambiar de la related_name a 'createe', y 'asignador' ya que si alguien tuviera acceso a un "destinatario" de objetos en su ejemplo, ¿obtendrían el 'asignador'? – orokusaki

0

El hecho de que dos columnas son parte de una tabla implica que los dos campos se relacionan, los mismos hacen referencia a ellos de forma individual no es lo ideal. El ForeignKey de su modelo debe ser la clave primaria de la tabla se hace referencia a:

event = models.ForeignKey('event') 

A continuación, hacer referencia a las columnas como tal:

foo.event.actor 
foo.event.receiver 

Si lo desea, también puede cambiar la forma en que su clase/modelo hace referencia a los atributos externos con propiedades. En su clase que haría lo siguiente:

@property 
def actor(self): 
    return self.event.actor 
@property 
def receiver(self): 
    return self.event.receiver 

Esto le permitiría a continuación, llamar a foo.actor y foo.receiver pero creo que el más largo, foo.event.actor sería más Pythonic

6

Desde el mensaje de error, suena como que está tratando de poner dos claves ajenas al mismo objeto en una mesa, un intermediario utilizado mediante el argumento through a ManyToManyField, la documentation for which states:

When you set up the intermediary model, you explicitly specify foreign keys to the models that are involved in the ManyToMany relation. This explicit declaration defines how the two models are related.

There are a few restrictions on the intermediate model:

  • Your intermediate model must contain one - and only one - foreign key to the target model (this would be Person in our example). If you have more than one foreign key, a validation error will be raised.
  • Your intermediate model must contain one - and only one - foreign key to the source model (this would be Group in our example). If you have more than one foreign key, a validation error will be raised.
Cuestiones relacionadas