2010-12-14 20 views
47

Desidero memorizzare alcune informazioni aggiuntive in quanto, creato automaticamente, ManyToMany join-table. Come potrei farlo in Django?Molte relazioni di Django con campi aggiuntivi

Nel mio caso ho due tabelle: "Dipendenti" e "Progetti". Quello che voglio memorizzare è quanto ciascuno dei dipendenti riceve per ora di lavoro in ciascuno dei progetti, poiché tali valori non sono gli stessi. Quindi, come lo farei?

Quello che mi è accaduto era, al posto del metodo "ManyToManyField", creare esplicitamente una terza classe/tabella per memorizzare quelle nuove informazioni e impostare la sua relazione con "Dipendenti" e "Progetti" usando il metodo "ForeignKey" . Sono abbastanza sicuro che funzionerà, ma è questo l'approccio migliore?

+2

Eventuali duplicati di [Come aggiungere colonna nella ManyToMany tabella (Django)] (http://stackoverflow.com/questions/12567151/how-to-add-column-in-manytomany-table-django) – ravi404

+0

@ravz Perché non dovrebbe essere chiuso come un duplicato di questo, invece? – TylerH

+0

@TylerH questo è un post più vecchio. Comunque entrambe le domande hanno risposte, suggerirei di unirle. – ravi404

risposta

69

Ecco esempio di ciò che si vuole raggiungere:

http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

In caso di collegamento si rompe mai:

from django.db import models 

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 
+0

Come posso accedere a date_joined in un modello? Group.date_joined non funziona. – Timo

+0

La data di gruppo unita non funzionerà, perché il gruppo stesso non si aggiunge a nulla. Invece, puoi ottenere i suoi membri e ottenere il loro tempo di partecipazione. per membro in group.members.all(): – gruszczy

+1

Come posso utilizzare group.members.add() con l'approccio sopra? – Dejell

Problemi correlati