2013-06-28 8 views
5

ho due classi nel mio file models.py:Come rimuovere il campo ID ridondante nella tabella ManyToMany generata automaticamente in Django?

class Person: 
    person_name = models.CharField(max_length = 50) 

class Course: 
    course_name = models.CharField(max_length = 50) 
    course_person = models.ManyToManyField(Person) 

Nel mio esempio modificato, una persona è prende molti corsi e un corso è preso da molte persone, da qui ManyToMany.

Quando lascio Django generare automaticamente il mio tavolo, ottengo un campo supplementare ID. Desidero che la tabella autogenerata di person_course sia composta da due chiavi composite person_id e course_id. Nota: entrambi sono campi auto-generati e auto-incrementati.

Ho anche cercato di definire la mia classe ManyToMany e ha tentato di collegare i campi utilizzando la parola chiave through=, ma che non ha aiutato.

Ho chiesto a Google ma senza molto aiuto. Molti alcuni geni tra di voi in grado di fornire qualche suggerimento :)

risposta

6

Django attualmente does not support composite primary key by default

Che cosa si può fare invece è tenere l'auto generato id come (surrogato) chiave primaria e quindi definire un rapporto unique_together nella tabella through .

class Meta: 
    unique_together = (course, person) 

In questo modo, è possibile garantire voci univoche nella tabella attraverso, e quando si fa riferimento al id è l'equivalente di riferimento unico (course, person) che è quello che vogliamo in ogni modo.

Ci sono alcuni third party apps che implementano questa funzione se lo si desidera. Tuttavia, a meno che non sia assolutamente necessario (come un supporto di sistema legacy), lo terrei semplice e attui lo unique_together.

+2

Grazie per l'input. Bene, è una limitazione di Django non essere in grado di farlo. Django cerca di semplificare la vita. Ho usato per progettare database da zero per l'utilizzo nelle mie app e non sono così felice che Django cerchi di fare tutto da solo. Almeno, non ho così tanto controllo su _some_ cose, come non creare il campo ID ridondante. Uso il workbench MySQL per rappresentare visivamente i miei database, e questo campo extra ID non sembra buono. Comunque, dal momento che non influenza la logica dell'app, posso conviverci :) – shailenTJ

Problemi correlati