2009-08-18 6 views
1

私は、次の2つのモデルがあります:私はこれまで、クエリとで午前のはここDjangoアノテーションの関連項目をフィルタリングすることはできますか?

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日間。しかし、私はすべてのカテゴリーを返すだけでなく、適格な仕事を持つカテゴリーだけでなく、

答えて

1

私はこれに違ってアプローチを決心し、注釈をまったく使用しないことを選択しました。私は、アクティブ(30日以下の)ジョブだけを返すJobモデルにマネージャを追加し、インスタンスのジョブ数を問い合わせたJobCategoryモデルのプロパティを作成しました。私のtemplatetagは単にすべてのカテゴリを返しました。ここに関連コードがあります。

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} 
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} 

見る "lookups-that-span-relationships"。 Hmmm ...おそらくすべてのカテゴリを取得するためにそこに別のクエリが必要です...

+1

これは、過去30日以内に作成されたジョブを持っているカテゴリのみを返します。また、複数のクエリーセットを返すことを避けようとしています。これは、アノテーションを使用する目的に反するためです。この関数は実際にはtemplatetagとして存在し、テンプレートレイヤーで、各カテゴリにカウントを含めることを望んでいました(カウントが0であっても)。ありがとう、結構です。 – gsiegman

+0

ええ、私はちょうど2つのクエリを実行する必要があると思います。 – monkut

関連する問題