2010-12-14 110 views
47

Je souhaite stocker des informations supplémentaires dans la table de jointure ManyToMany, créée automatiquement. Comment ferais-je cela dans Django?Relation ManyToMany de Django avec des champs supplémentaires

Dans mon cas, j'ai deux tables: "Employés" et "Projets". Ce que je veux stocker, c'est combien chaque employé reçoit par heure de travail dans chacun des projets, puisque ces valeurs ne sont pas les mêmes. Alors, comment ferais-je cela? Ce qui m'est venu à l'esprit, au lieu de la méthode "ManyToManyField", créer explicitement une troisième classe/table pour stocker ces nouvelles informations et définir sa relation avec "Employees" et "Projects" en utilisant la méthode "ForeignKey" . Je suis sûr que ça marchera, mais est-ce la meilleure approche?

+2

double possible de [Comment ajouter la colonne dans ManyToMany Table (Django)] (http://stackoverflow.com/questions/12567151/how-to-add-column-in-manytomany-table-django) – ravi404

+0

@ravz Pourquoi ne pas fermer celui-ci en dupe de celui-ci, à la place? – TylerH

+0

@TylerH c'est un post plus ancien. Cependant les deux questions ont des réponses, je suggérerais de les fusionner. – ravi404

Répondre

69

Voici exemple de ce que vous voulez atteindre:

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

En lien de cas se casse jamais:

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

Comment puis-je accéder à la date_joined dans un modèle? Group.date_joined ne fonctionne pas. – Timo

+0

La date de groupe jointe ne fonctionnera pas, car le groupe lui-même ne joint rien. Au lieu de cela, vous pouvez obtenir ses membres et obtenir leur temps de participation. pour membre dans group.members.all(): – gruszczy

+1

Comment utiliser group.members.add() avec l'approche ci-dessus? – Dejell