together timefield primary many foreign example delete create django foreign-keys ambiguity

timefield - Modelo Django con 2 llaves foráneas de la misma mesa



textfield django example (4)

Quería un modelo de Django con 2 claves externas 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:

Error: uno o más modelos no validaron: tasks.task: modelo intermedio TaskEvent tiene más de una clave externa para Employee, que es ambigua y no está permitida.

¿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?


A partir del mensaje de error, parece que está intentando colocar dos claves externas al mismo objeto en una tabla intermedia utilizada a través del argumento a through de ManyToManyField , ManyToManyField documentación establece :

Cuando configura el modelo intermediario, especifica explícitamente claves externas a los modelos que están involucrados en la relación ManyToMany. Esta declaración explícita define cómo se relacionan los dos modelos.

Hay algunas restricciones en el modelo intermedio:

  • Su modelo intermedio debe contener una, y solo una, clave externa para el modelo objetivo (esto sería Persona en nuestro ejemplo). Si tiene más de una clave externa, se generará un error de validación.
  • Su modelo intermedio debe contener una, y solo una, clave externa para el modelo fuente (esto sería Grupo en nuestro ejemplo). Si tiene más de una clave externa, se generará un error de validación.


El hecho de que dos columnas sean parte de una tabla implica que los dos campos están relacionados, por lo tanto, para referenciarlos individualmente no es ideal. La clave externa de su modelo debe ser la clave principal de la tabla a la que hace referencia:

event = models.ForeignKey(''event'')

A continuación, haría referencia a las columnas como tales:

foo.event.actor foo.event.receiver

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

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

Esto te permitiría entonces llamar a foo.actor y foo.receiver, pero creo que cuanto más tiempo, foo.event.actor sería más pitónico.


No he hecho esto todavía, pero utilicé inspectdb para generar el archivo models.py de un DB existente que hace exactamente eso, esto es lo que inspectdb lanzó, por lo que debería funcionar:

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

Espero que te funcione, si no, también voy a tener un problema.