2009-08-15 17 views
5

Los documentos Django dan this ejemplo de asociación de datos extra con una relación M2M. Aunque eso es sencillo, ahora que trato de utilizar los datos adicionales en mi opinión, me siento muy torpe (lo que generalmente significa "lo estoy haciendo mal").Usando los "campos adicionales" de las relaciones many-to-many de django con campos adicionales

Por ejemplo, el uso de los modelos definidos en el documento vinculado anteriormente que pueda hacer lo siguiente:

# 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.") 

Ahora si quiero imprimir una tabla sencilla que por cada persona que da la fecha de unión a cada banda , en el momento que estoy haciendo esto:

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 "" 

que se siente muy feo, especialmente el "m = person.membership_set.get (grupo = band.pk)" bits. ¿Estoy haciendo todo esto mal?

Ahora digo que quería ordenar a las personas para la fecha en que se unieron a una banda en particular (digamos los beatles) ¿hay alguna cláusula order_by que pueda poner en Person.objects.all() que me permita hacerlo?

Cualquier consejo sería muy apreciado.

Respuesta

3

Usted debe consultar el modelo de miembro en su lugar:

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 

Usando select_related aquí evitamos el 1 + n consultas problema, ya que cuenta la ORM para hacer la unión y selecciona todo en una sola consulta.

+1

Gracias por su respuesta. Por supuesto, responde la pregunta que hice, pero al reflexionar, me di cuenta de que hice una pregunta incorrecta. Tuve otro intento de explicar el espacio problemático [aquí] [1]. Aclamaciones. [1]: http://stackoverflow.com/questions/1291889/is-a-many-to- many-relationship-with-extra-fields-the-right-tool-for-my-job – whichhand

+0

Lesson # 2: los comentarios no aceptan marcado. – whichhand

Cuestiones relacionadas