2010-06-22 9 views
6

Tengo una base de datos heredada con una tabla que almacena una relación muchos a muchos, pero sin una sola columna de clave principal. ¿Hay alguna manera de convencer a Django para usarlo de todos modos?Django: Many-to-many a través de una tabla con (solo) clave compuesta

Esquemáticamente:

Product 1<---->* Labeling *<---->1 Label 

La tabla Labeling utiliza (product_id,label_id) como una clave primaria compuesta, y yo no veo ninguna manera de informar sobre este Django. (Solo usando through me da Unknown column 'labeling.id' in 'field list'.)

¿Debo recurrir a SQL personalizado? ¿O me estoy perdiendo algo?

Respuesta

1

Si agrega un unique_together al modelo para la tabla de muchos a muchos, Django usará esas columnas en vez de esperar una primaria clave llamada id.

+0

No realmente, creará el campo 'id' también. Hay una [solución temporal] (https://stackoverflow.com/a/28712960/52499). Pero en realidad, en mi caso, decidí ir con el campo 'id' adicional. Sin tablas heredadas –

1
+0

No esperaba que lo hiciera ... pero lo hizo: 'unique_together' es todo lo que se necesita para evitar que Django solicite una columna de clave principal. Si agrega eso (o palabras para ese efecto) a su respuesta, puedo aceptarlo. (Afaik 'db_index' es irrelevante: se aplica solo a campos individuales.) – Tikitu

+0

Si bien es cierto que Django ya no se queja si agrega unique_together * pero * todavía no es completamente funcional. Por ejemplo, delete (Model.Delete()) en el modelo especificado en los parámetros through, excepto. Soy lo suficientemente experto como para atreverme a dar esto como una respuesta, por lo que leí Django no admite que no tenga una clave principal en un modelo. – Boaz

+0

@Tikitu Gracias, gracias, gracias! Me estaba arrancando los pelos tratando de encontrar la manera de hacer que Django no requiriera una columna 'primary_key = True' para mi base de datos de solo lectura heredada con varias tablas intermedias de muchos a muchos. Sabía sobre 'unique_together', pero no me di cuenta de que haría que la insistencia de Django sobre' primary_key = True' desapareciera. Ahora que Django 1.8 en realidad emite advertencias sobre la configuración de 'primary_key = True' en un campo ForeignKey, esto de repente se volvió muy importante. – CoreDumpError

Cuestiones relacionadas