2015-11-29 35 views
0

我有由開始日期和持續時間限定的訂閱期(天)的模型:在Django濾波器使用DATEADD

class SubscriptionProduct(models.Model):  
    start_date = models.DateField() 
    duration = models.IntegerField() 

我需要能夠過濾訂閱當前處於活動狀態,例如起始日期<現在<起始日期+時間

我找不到Django的方式做到這一點。我可以使用使用Postgres的DATEADD相當於間隔中原始的SQL語句,但我更喜歡使用一些內置的和非DB具體。

我認爲理想我正在尋找一個DATEADD標註方法。就像:

SubscriptionProduct.objects.annotate(end_date=DateAdd('start_date','duration').filter(start_date__lt=datetime.now, end_date__gte=datetime.now) 

回答

0

我最終編寫了一個自定義的Func表達式,它完全符合我的要求。 這是非常具體的PostgreSQL的,有點哈克,但它的工作原理,在比上面所示的一個更復雜的查詢使用時也是如此。

class DateAdd(Func): 
    """ 
    Custom Func expression to add date and int fields as day addition 
    Usage: SubscriptionProduct.objects.annotate(end_date=DateAdd('start_date','duration')).filter(end_date__gt=datetime.now) 
    """ 
    arg_joiner = " + CAST(" 
    template = "%(expressions)s || ' days' as INTERVAL)" 
    output_field = DateTimeField() 

注意,我不得不做的arg_joiner伎倆,以便字段名的子查詢中使用時要妥善解決表達式