2010-01-28 17 views
5

Mam modeli w Django, które są mniej więcej tak:Zapytanie o ManytoMany Pole z Through w Django

class Classification(models.Model): 
    name = models.CharField(choices=class_choices) 
    ... 

class Activity(models.Model): 
    name = models.CharField(max_length=300) 
    fee = models.ManyToManyField(Classification, through='Fee') 
    ... 

class Fee(models.Model): 
    activity = models.ForeignKey(Activity) 
    class = models.ForeignKey(Classification) 
    early_fee = models.IntegerField(decimal_places=2, max_digits=10) 
    regular_fee = models.IntegerField(decimal_places=2, max_digits=10) 

Pomysł jest, że nie będzie to zestaw opłat związanych z każdej pary aktywny i klasyfikacji. Klasyfikacja jest jak student, pracownik, itp.

Wiem, że część działa poprawnie.

Wtedy w mojej aplikacji kwerendy dla zestawu działań z:

activities = Activity.objects.filter(...) 

która zwraca listę działań. Muszę wyświetlić w moim szablonie listę działań wraz z ich opłatami. Coś takiego:

Activity Name 
Student Early Price - $4 
Student Regular Price - $5 
Staff Early Price - $6 
Staff Regular Price - $8 

Ale nie wiem, w prosty sposób, aby uzyskać te informacje bez konkretnego zapytania get opłat obiektów dla każdej pary aktywność/klasy.

miałem nadzieję to będzie działać:

activity.fee.all() 

Ale to właśnie zwraca obiekt klasyfikacji. Czy istnieje sposób, aby uzyskać dane obiektu opłaty dla pary za pośrednictwem już zadanych pytań?

Czy robię to zupełnie źle?

Odpowiedz

5

Biorąc pod uwagę końcówkę michuk do zmiany nazwy „opłaty” do „Klasyfikacja”:

domyślna nazwa dla obiektów opłatę modelu aktywny będzie fee_set. Tak, aby uzyskać dostęp do cen, to zrobić:

for a in Activity.objects.all(): 
    a.fee_set.all() #gets you all fees for activity 

Jest jedna rzecz, chociaż, jak widać skończysz robić 1 Wybierz na każdego przedmiotu działalności do opłat, istnieją pewne aplikacje, które mogą pomóc w na przykład django-batch-select wykonuje tylko 2 zapytania w tym przypadku.

1

Przede wszystkim uważam, że źle wskazałeś swoje pole. To:

fee = models.ManyToManyField(Classification, through='Fee') 

powinno być raczej:

classifications = models.ManyToManyField(Classification, through='Fee') 

jak ManyToManyField odnosi się do listy pokrewnych przedmiotów.

Ogólnie ManyToManyField, AFAIK, jest tylko skrótem django, aby umożliwić łatwe pobieranie wszystkich powiązanych obiektów (klasyfikacja w twoim przypadku), przy czym tablica asocjacji jest przezroczysta dla modelu. To, czego potrzebujesz, to tabela asocjacji (Opłata w twoim przypadku) nie jest przejrzysta.

Co powinienem zrobić, aby usunąć pole ManyToManyField z działania i po prostu uzyskać wszystkie opłaty związane z działaniem. A następnie jeśli potrzebujesz Klasyfikacji dla każdej opłaty, uzyskaj Klasyfikację osobno.

Powiązane problemy