2010-01-28 83 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字段,并简单地获得与该活动相关的所有费用。然后,如果您需要每种费用的分类,请单独获取分类。