2010-06-22 1 views
6

Ho un database legacy con una tabella che memorizza una relazione molti-a-molti, ma senza una singola colonna chiave primaria. C'è un modo per convincere Django ad usarlo comunque?Django: Molti-a-molti attraverso una tabella con (solo) chiave composta

Schematicamente:

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

La tabella Labeling utilizza (product_id,label_id) come chiave primaria composta, e non vedo alcun modo per informare Django su questo. (Usare semplicemente through mi dà Unknown column 'labeling.id' in 'field list'.)

Devo tornare a SQL personalizzato? O mi sta sfuggendo qualcosa?

risposta

1

Se si aggiunge un unique_together al modello per la tabella molti-a-molti, Django utilizzerà queste colonne, invece di attesa di un primario tasto chiamato id.

+0

Non proprio, creerà anche il campo 'id'. C'è un [soluzione alternativa] (https://stackoverflow.com/a/28712960/52499). Ma in realtà nel mio caso ho deciso di andare con un campo 'id' in più. Nessuna tabella legacy. –

1
+0

Non mi aspettavo che sarebbe ... ma ha fatto: 'unique_together' è tutto ciò che è necessario per fermare Django chiedendo una colonna chiave primaria. Se aggiungete questo (o le parole in tal senso) alla vostra risposta, posso accettarlo. (Afaik 'db_index' è irrilevante: si applica solo ai singoli campi.) – Tikitu

+0

Mentre è vero che Django non si lamenta più se si aggiunge unique_together * ma * non è ancora completamente funzionante. Ad esempio, delete (Model.Delete()) sul modello specificato nei parametri through eccetto. Sono abbastanza esperto da osare dare una risposta, perché quello che ho letto Django non supporta il fatto di non avere una chiave primaria su un Modello. – Boaz

+0

@Tikitu Grazie, grazie, grazie! Mi stavo strappando i capelli cercando di immaginare un modo per fare in modo che Django non richiedesse una colonna 'primary_key = True' per il mio database di sola lettura legacy con diverse tabelle intermedie molti-a-molti. Sapevo di "unique_together", ma non mi ero reso conto che avrebbe fatto perdere l'insistenza di Django su "primary_key = True". Ora che Django 1.8 emette effettivamente avvertimenti sull'impostazione di 'primary_key = True' su un campo ForeignKey, questo è diventato improvvisamente molto importante. – CoreDumpError