2015-09-06 61 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。 –