3

我正在尝试为我的 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

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

4

3 回答 3

3

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

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

MyModel.objects.filter(expired__lte=current_date)

然后在更新模型时:

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

或类似的东西。

于 2009-11-14T17:43:46.533 回答
0

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

filter(lambda x: x.last_check <= datetime.now() - timedelta(seconds = x.interval), MyModel.objects.all())
于 2009-11-15T11:20:55.443 回答
-1

对这种查询的支持正在开发中: http ://code.djangoproject.com/ticket/10154

于 2010-09-13T14:39:58.750 回答