2010-04-20 6 views
0

Ma question est à peu près la même as this question, sauf que toutes les relations devraient être plusieurs-à-plusieurs.Comment décrire m2m triple-join table dans le modèle (Django)

Je les classes suivantes dans mon models.py (un peu simplifiée):

class Profile(models.Model): 
    # Extending the built in User model 
    user = models.ForeignKey(User, unique=True) 
    birthday = models.DateField() 

class Media(models.Model): 
    title = models.CharField(max_length=200) 
    description = models.TextField(max_length=2000) 

class Role(models.Model): 
    name = models.CharField(max_length=50) 


Ce que je veux est une table de jonction qui ressemble à ceci:

CREATE TABLE `media_roles` (
    `media_id` bigint(20) unsigned NOT NULL, 
    `profile_id` bigint(20) unsigned NOT NULL, 
    `role_id` bigint(20) unsigned NOT NULL 
) 


  • John Doe - Réalisateur, Scénariste, Producteur
  • Jane Doe - Producteur exécutif
  • ...

C'est ce que je l'ai utilisé jusqu'à présent:

class MediaRole(models.Model): 
    media = models.ForeignKey(Media) 
    user = models.ForeignKey(Profile) 
    role = models.ForeignKey(Role) 


Mais est-il pas de meilleure façon de le faire, pas impliquant la création d'une classe séparée dans le modèle?

+1

Ceci est la solution standard. Que pensez-vous qui ne va pas avec? S'il vous plaît détailler les choses que vous n'aimez pas à ce sujet. –

+0

Ce n'est pas que je pense qu'il y a quelque chose qui ne va pas. Je pensais juste qu'il y aurait un autre moyen qui me donnerait des fonctionnalités gratuites comme un standard ManyToManyField. – jmagnusson

+0

Ce n'est pas ** un simple plusieurs-à-plusieurs. C'est un cas exceptionnel rare. –

Répondre

0

Qu'en est-il de séparer les deux relations m2m?

class Profile(models.Model): 
    ... 
    medias = models.ManyToManyField(Media, related_name='profiles') 
    roles = models.ManyToManyField(Role, related_name='profiles') 

De cette façon Django créer deux tables d'association pour vous, et vous pouvez utiliser les domaines connexes pratiques comme celui-ci:

profile = Profile.objects.get(user=someone) 
print profile.medias.all() 
print profile.roles.all() 
+0

Comment cela permettrait-il d'attribuer plusieurs rôles par profil par téléchargement de média? Je suis confus – jmagnusson

+0

@Saosin, il semble que vous voulez une relation m2m entre 'Profile' et' Media', et pour chacune de ces relations, il y a beaucoup de 'Roles'. Si c'est le cas, vous pouvez essayer de créer une table d'association de 'Profile' et' Media', puis faire de 'roles' une clé étrangère. – satoru

+0

En utilisant un modèle intermédiaire avec 'à travers' comme ceci: http://docs.djangoproject.com/fr/dev/topics/db/models/#extra-fields-on-many-to-many-relationships? Comme il ne peut y avoir que deux clés étrangères - l'une pointant vers le modèle source et l'autre vers la cible qui ne fonctionnerait pas. Ou ai-je mal compris la documentation? – jmagnusson

Questions connexes