我決定採取不同的方法,並選擇不使用註釋。我向作業模型中添加了一個管理器,該管理器僅返回活動(30天或更少的舊作業),並在JobCategory模型上創建一個屬性,以查詢實例的作業計數。我的模板標籤只是返回所有類別。這是相關的代碼。
class JobCategory(models.Model):
title = models.CharField(_('title'), max_length=50, help_text=_("Max 50 chars. Required."))
slug = models.SlugField(_('slug'), help_text=_("Only letters, numbers, or hyphens. Required."))
class Meta:
verbose_name = _('job category')
verbose_name_plural = _('job categories')
def __unicode__(self):
return self.title
def get_absolute_url(self):
return reverse('djobs_category_jobs', args=[self.slug])
@property
def active_job_count(self):
return len(Job.active.filter(category=self))
class ActiveJobManager(models.Manager):
def get_query_set(self):
return super(ActiveJobManager, self).get_query_set().filter(created_date__gte=datetime.datetime.now() - datetime.timedelta(days=30))
class Job(models.Model):
title = models.CharField(_('title'), max_length=50, help_text=_("Max 50 chars. Required."))
description = models.TextField(_('description'), help_text=_("Required."))
category = models.ForeignKey(JobCategory, related_name='jobs')
employment_type = models.CharField(_('employment type'), max_length=5, choices=EMPLOYMENT_TYPE_CHOICES, help_text=_("Required."))
employment_level = models.CharField(_('employment level'), max_length=5, choices=EMPLOYMENT_LEVEL_CHOICES, help_text=_("Required."))
employer = models.ForeignKey(Employer)
location = models.ForeignKey(Location)
contact = models.ForeignKey(Contact)
allow_applications = models.BooleanField(_('allow applications'))
created_date = models.DateTimeField(auto_now_add=True)
objects = models.Manager()
active = ActiveJobManager()
class Meta:
verbose_name = _('job')
verbose_name_plural = _('jobs')
def __unicode__(self):
return '%s at %s' % (self.title, self.employer.name)
和標籤...
def job_categories():
categories = JobCategory.objects.all()
return {'categories': categories}
這將返回只有那些在過去30天內創建工作的類別。我也試圖避免返回多個查詢集,因爲這違反了使用註釋的目的。這個函數實際上是作爲模板標籤存在的,我希望在模板層中包含每個類別的計數(即使計數爲0)。謝謝你。 – gsiegman 2009-08-18 13:31:58
是的,我認爲你只需要執行兩個查詢。 – monkut 2009-08-19 00:47:30