我正在尝试在我的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
知道如何解决这个问题吗?
答案 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