2009-08-15 6 views
5

Les documents Django donnent this exemple d'association de données supplémentaires avec une relation M2M. Bien que ce soit simple, maintenant que j'essaie d'utiliser les données supplémentaires de mon point de vue, je me sens très maladroit (ce qui signifie en général «Je me trompe»).Utilisation des "champs supplémentaires" de django relations plusieurs-à-plusieurs avec des champs supplémentaires

Par exemple, en utilisant les modèles définis dans le document lié ci-dessus, je peux faire ce qui suit:

# Some people 
ringo = Person.objects.create(name="Ringo Starr") 
paul = Person.objects.create(name="Paul McCartney") 
me = Person.objects.create(name="Me the rock Star") 
# Some bands 
beatles = Group.objects.create(name="The Beatles") 
my_band = Group.objects.create(name="My Imaginary band") 
# The Beatles form 
m1 = Membership.objects.create(person=ringo, group=beatles, 
    date_joined=date(1962, 8, 16), 
    invite_reason= "Needed a new drummer.") 
m2 = Membership.objects.create(person=paul, group=beatles, 
    date_joined=date(1960, 8, 1), 
    invite_reason= "Wanted to form a band.") 
# My Imaginary band forms 
m3 = Membership.objects.create(person=me, group=my_band, 
    date_joined=date(1980, 10, 5), 
    invite_reason= "Want to be a star.") 
m4 = Membership.objects.create(person=paul, group=my_band, 
    date_joined=date(1980, 10, 5), 
    invite_reason= "Wanted to form a better band.") 

Maintenant, si je veux imprimer un tableau simple que pour chaque personne donne la date à laquelle ils ont rejoint chaque bande , au moment où je fais ceci:

bands = Group.objects.all().order_by('name') 

for person in Person.objects.all(): 
    print person.name, 
    for band in bands: 
     print band.name, 
     try: 
      m = person.membership_set.get(group=band.pk) 
      print m.date_joined, 
     except: 
      print 'NA', 
    print "" 

qui se sent très laid, en particulier le "m = person.membership_set.get (groupe = band.pk)" bit. Est-ce que je vais à propos de toute cette affaire? Maintenant, disons que je voulais commander les gens à la date à laquelle ils ont rejoint un groupe particulier (disons les beatles) y a-t-il une clause order_by sur Person.objects.all() qui me permettrait de faire ça?

Un conseil serait grandement apprécié.

Répondre

3

Vous devriez interroger le modèle d'adhésion à la place:

members = Membership.objects.select_related('person', 'group').all().order_by('date_joined') 

for m in members: 
    print m.band.name, m.person.name, m.date_joined 

En utilisant select_related ici, nous évitons le 1 + n interroge problème, car il raconte l'ORM faire la jointure et sélectionne tout en une seule requête.

+1

Merci pour votre réponse. Bien sûr, il répond à la question que j'ai posée, mais après réflexion, j'ai réalisé que je posais la mauvaise question. J'ai eu une autre tentative d'expliquer l'espace problème [ici] [1]. À votre santé. [1]: http://stackoverflow.com/questions/1291889/is-a-many-to-many-relationship-with-extra-fields-the-right-tool-for-my-job – whichhand

+0

Leçon # 2: les commentaires n'acceptent pas le balisage. – whichhand

Questions connexes