2012-11-10 138 views
2

我從模型中獲取某些特定對象時遇到了一些問題。基於計算的模型過濾

我的模式是這樣的:

class Subscription(models.Model): 
    subscriber = models.ForeignKey(Subscriber, null=False, blank=False, default=None, editable=False) 
    plan = models.ForeignKey(SubscriptionPlan, null=False, blank=False) 
    active_from_date =models.DateField(null=False, blank=False) 

class SubscriptionPlan(models.Model): 
    name = models.CharField(max_length=50, null=False, blank=False, default=None) 
    interval = models.PositiveIntegerField(null=False, blank=False, default=30) 

現在,我想只有這些訂閱哪些是有效的,所以我想是這樣的:

valid = Subscription.objects.filter(valid_from_date__gte=(datetime.date.today()-timedelta(days=plan__interval))) 

我有問題訪問以計劃plan_interval。如果我嘗試在這個地方使用常量值,例如10,那麼一切正常。

你有什麼建議如何在過濾器計算中使用plan.interval值?

+0

是否生成錯誤? –

+0

我得到運行時錯誤:「全局名稱'plan__interval'未定義」 – Grzegorz

回答

1

您可能會感興趣的:因爲很難將整數日期時間的時候要一致 Filtering with calculations on fields

我還有一個疑問,所以你可以另DatetimeField添加到您的Subscription和填充用這個值根據​​ForeignKey的結束日期,例如在訂購的save(self, *args, **kwargs)方法中。

+0

我知道我可以添加新的字段,但它是我的重點。這種方法也可能使其他情況複雜化,例如將計劃改爲訂閱。 – Grzegorz

0

我想你可以使用註釋功能的過濾器

valid = Subscription.objects.annotate(plan_interval = Sum('plan__interval')).filter(valid_from_date__gte=(datetime.date.today()-timedelta(days=plan_interval))) 
+0

在我的情況下是不可能訂閱沒有設置計劃。在這種情況下,我仍然得到錯誤:「全球名稱'plan__interval'未定義」 – Grzegorz

+0

請原諒我,我讀了錯誤的問題。我已經更新了我的答案。看看 –

+0

不幸的是之後,我仍然得到錯誤「全球名稱'plan_interval'未定義」。你有什麼建議,我該如何解決這個問題? – Grzegorz

1

Raunak阿加瓦爾的答案似乎很高興使用外鍵,但試試這個:

有效= Subscription.objects.filter(active_from_date_ GTE = datetime.date.today() - F('計劃 _interval'))

+0

不錯的工作,這正是他想要的 –