2016-02-06 11 views
2

我有一個項目,其中用戶決定一個帖子將被激活多久,所以在一段時間後,該帖子將改變狀態。使用芹菜cron作業時間根據用戶時間決定

爲了解決這個問題,對於運行異步任務和性能,我認爲最好的選擇是使用芹菜。

我沒有用芹菜呢,我只瞭解ETA(預計到達時間),過期的文件,用鼠標右鍵here.

我的問題是:

什麼是適當的方式(如果可能的話)做到這一點?

建議在模型上使用持續時間字段還是日期時間字段(最長持續時間爲1天和12小時)?

我是否需要爲每個Post或Celery創建一個cron作業可以解決這個問題?

回答

1

您可以使用Celery來實現此目的,並且可以將數據庫更新掛鉤到Celery計劃任務,但是對於顯示或不顯示過期帖子這樣的簡單情況,這可能是矯枉過正的。

下面是一個設置計算屬性的簡單示例。只需引用計算屬性active來決定是否顯示帖子。

import datetime 
from django.db import models 
from django.utils.timezone import now, localtime 

class Post(models.Model): 
    created = models.DateTimeField(blank=True) 
    title = models.CharField(max_length=100) 
    body = models.CharField(max_length=2000) 
    expires = models.DateTimeField(blank=True) 

    @property 
    def active(self): 
     return self.expires > localtime(now()) 

    def save(self, *args, **kwargs): 
     self.created = localtime(now()) 
     self.expires = self.created + datetime.timedelta(hours=36) 
     return super(Post, self).save(*args, **kwargs) 
+0

感謝您的答案,但我認爲這不起作用,因爲當創建後,它執行'self.expires'和'self.created'返回一個'NoneType'。 – Rod

+0

@Rod,我編輯了我的答案,明確設置了'self.created'。這個問題可能是Django在調用save之前不會設置該值。再試一次 。這應該工作。 –

+0

這可行,但它不能解決問題,因爲我需要爲每個帖子調用'active'函數來查看它是否過期。這個想法是Post會自動改變狀態。 – Rod