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.
Creo que lo que estás buscando es la propiedad related_name en ForeignKeyFields. Esto le permitirá hacer referencia a la misma tabla, pero otorgue a django nombres especiales para la relación.
Más informació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.