2015-09-06 64 views
0

我有我的模型设置是这样的:如何使用Django中的函数过滤查询集?

class Article(models.Model): 
    published_date = models.DateTimeField(defualt = timezone.now()) 
    ..... 
    def was_published_in_last_week(self): 
     now = timezone.now() 
     return now - datetime.timedelta(days = 7) <= self.published_date <= now 

功能检查,如果文章内的最近7天的出版,它工作正常。

但是,如何使用它获取包含仅在过去7天内发布的文章的查询集?

在此先感谢!

+1

你不能用一个函数滤波器。然而,这个逻辑被平凡地转换为过滤表达式。 –

回答

3

您需要一个custom model manager,该模型适用于整个模型。您在模型类中定义的功能仅适用于型号实例

当您使用模型类时,您已经在使用默认模型管理器objects;您只需使用自定义过滤器编写另一个。现在

# First, define a manager subclass 
class PublishedLastWeekManager(models.Manager): 
    def get_queryset(self): 
     now = timezone.now() 
     start = now - datetime.timedelta(days=7) 
     return super(PublishedLastWeekManager, self).get_queryset().filter(published_date__range=[start, now]) 

class Article(models.Model): 

    objects = models.Manager() # The default manager. 
    published_last_week = PublishedLastWeekManager() # New manager 

,你可以做这样的事情:

Article.published_last_week.all() 
+0

它完美的作品!非常感谢。除了PublishedBookManager应该是PublishedLastWeekManager。 –