Django根据模型本身的间隔获取模型对象

时间:2009-11-14 16:30:55

标签: django models

我正在尝试在我的Django应用程序中获取模型的所有过期对象。

该模型如下所示:

MyModel(models.Model):
    owner = models.ForeignKey(User)
    last_check = models.DateTimeField(blank=True, null=True)
    interval = models.IntegerField(default=1800)

我需要获取所有匹配的对象,其中last_check早于现在减去检查间隔,以确定是否应该再次检查该对象。

如果我使用静态间隔没问题:

time_diff = datetime.now() - timedelta(seconds=1800)
MyModel.object.filter(last_check__lte=time_diff)

但是当模型本身的间隔时,我无法弄清楚如何去做。这就是我试过的:

objects_to_check = MyModel.objects.filter(
                                        last_check__isnull=False
                                    ).filter(
                                        last_check__lte=datetime.now() - timedelta(seconds=F('interval'))
                                    )

但这根本不起作用,只给了我以下错误

unsupported type for timedelta seconds component: F

知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

嗯......我不确定你是否可以修改被查找字段的值。数据库仍然需要首先检索值,在其上应用函数timedelta,然后进行比较。

我认为您可能需要重新考虑您的架构......但我可能错了。也许存储过期的属性,而不是存储last_check,您可以直接检查:

MyModel.objects.filter(expired__lte=current_date)

然后更新模型时:

def save(self):
    self.expired = datetime.now() + self.interval;

或类似的东西。

答案 1 :(得分:0)

F对象代表 SQL查询中对模型字段的引用,因此您无法使用它初始化Python对象。您可以使用extra方法编写特定于数据库的查询,或者只在Python级别上过滤它们:

filter(lambda x: x.last_check <= datetime.now() - timedelta(seconds = x.interval), MyModel.objects.all())

答案 2 :(得分:-1)

支持此类查询正在进行中: http://code.djangoproject.com/ticket/10154