2009-08-15 12 views
5

Dokumenty Django dają this przykład powiązania dodatkowych danych ze stosunkiem M2M. Chociaż to jest proste, teraz, gdy próbuję wykorzystać dodatkowe dane w moich poglądach, jest to bardzo niezdarne (co zwykle oznacza "robię to źle").Korzystanie z "dodatkowych pól" w relacjach wiele-do-wielu django z dodatkowymi polami

Na przykład, korzystając z modeli określonych w połączonym dokumencie powyżej można wykonać następujące czynności:

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

Teraz jeśli chcę wydrukować prostą tabelę, że dla każdej osoby, podaje datę, że dołączył każdy zespół w tej chwili robię to:

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

Który czuje się bardzo brzydki, zwłaszcza "m = person.membership_set.get (grupa = band.pk)" bit. Czy wszystko w porządku?

Teraz mówię, że chciałem zamówić ludzi przed datą, w której dołączyli do konkretnego zespołu (powiedzmy beatlesów), czy istnieje klauzula order_by, którą mogę umieścić na Person.objects.all(), która pozwoliłaby mi to zrobić?

Każda rada byłaby mile widziana.

Odpowiedz

3

Należy zapytać model Membership Zamiast:

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 

Korzystanie select_related tutaj unikamy 1 + n odpytuje problem, jak to mówi ORM zrobić sprzężenia i wybiera wszystko w jednym zapytaniu.

+1

Dzięki za odpowiedź. Oczywiście odpowiada na pytanie, które zadałem, ale po refleksji zdałem sobie sprawę, że zadałem niewłaściwe pytanie. Miałem kolejną próbę wyjaśnienia problemu przestrzeni [tutaj] [1]. Twoje zdrowie. [1]: http://stackoverflow.com/questions/1291889/to--many-to-many-relationship-z-extra-fields-the-right-tool-for-my-job – whichhand

+0

Lekcja 2: komentarze nie akceptują znaczników. – whichhand

Powiązane problemy