2010-01-28 99 views
5

我有Django的一個模型是這樣的:查詢一個多對多場與通過在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) 

的想法是,將有一組與每個活動和分類對相關費用。分類就像學生,工作人員等

我知道那部分是正確的。

然後在我的申請,我查詢了一組活動:

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

它返回的活動列表。我需要在我的模板中顯示活動費用清單。事情是這樣的:

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

但我不知道一個簡單的方法,而不費的具體GET查詢對象爲每個活動/類對得到這個信息。

我希望這會工作:

activity.fee.all() 

但是,這只是返回分類對象。有沒有辦法通過我已經查詢的活動獲得對的費用對象數據?

還是我這樣做完全錯了?

回答

5

考慮michuk的小費重命名「收費標準」,「分類」:

默認名稱上的活動模型收費對象將fee_set。因此,爲了得到你的價格,這樣做:

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

有一兩件事來,因爲你可以看到你就會爲這樣的費用每個活動對象上做1選擇,也有一些應用可以與幫助例如,在這種情況下,django-batch-select只做2個查詢。

1

首先,我認爲你的名字命名錯誤。這:

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

應該是相當的是:

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

爲ManyToManyField是指相關對象的列表。

一般而言,ManyToManyField AFAIK只是一個django快捷鍵,可以輕鬆獲取所有相關對象(在您的情況下爲Classification),並且關聯表對模型透明。你想要的是關聯表(費用在你的情況下)不是是透明的。

所以我會做的是從活動中刪除ManyToManyField字段,並簡單地獲得與該活動相關的所有費用。然後,如果您需要每種費用的分類,請單獨獲取分類。