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.
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
Lekcja 2: komentarze nie akceptują znaczników. – whichhand