1

私は次の2つのモデルを持っています:

class Job(models.Model):
    title = models.CharField(_('title'), max_length=50)
    description = models.TextField(_('description'))
    category = models.ForeignKey(JobCategory, related_name='jobs')
    created_date = models.DateTimeField(auto_now_add=True)

class JobCategory(models.Model):
    title = models.CharField(_('title'), max_length=50)
    slug = models.SlugField(_('slug'))

これまでのクエリで私がいる場所は次のとおりです。

def job_categories():
    categories = JobCategory.objects.annotate(num_postings=Count('jobs'))
    return {'categories': categories}

問題は、過去 30 日間に作成されたジョブのみをカウントしたいことです。ただし、資格のある仕事があるカテゴリだけでなく、すべてのカテゴリを返したいと考えています。

4

2 に答える 2

4

あくまでも推測ですが・・・これでうまくいくでしょうか?

def job_categories():
    thritydaysago = datetime.datetime.now() - datetime.timedelta(days=30)
    categories = JobCategory.objects.filter(job__created_date__gte=thritydaysago).annotate(num_postings=Count('jobs'))
    return {'categories': categories}

スパン クエリの詳細については、「ルックアップ - スパン - リレーションシップ」を参照してください。うーん...すべてのカテゴリを取得するには、おそらくそこに別のクエリが必要です...

于 2009-08-18T07:18:26.413 に答える
1

私はこれに別の方法でアプローチすることに決め、注釈をまったく使用しないことにしました。アクティブな (30 日以内の) ジョブのみを返す Job モデルにマネージャーを追加し、インスタンスのジョブ数を照会する 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}
于 2009-08-21T07:41:27.430 に答える