我正在尝试获取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
你知道怎么解决这个问题吗?
发布于 2009-11-14 17:43:47
嗯..。我不确定您是否可以修改正在查找的字段的值。数据库仍然需要首先检索值,对其应用函数timedelta,然后进行比较。
我认为你可能需要重新考虑你的架构...但我可能错了。也许不存储last_check,而存储过期的属性,您可以直接检查该属性:
MyModel.objects.filter(expired__lte=current_date)
然后在更新模型时:
def save(self):
self.expired = datetime.now() + self.interval;
或者类似的东西。
发布于 2009-11-15 11:20:55
Python表示对Python查询中的模型字段的引用,因此不能使用它初始化F
对象。您可以使用extra
方法编写特定于数据库的查询,也可以只在Python级别对其进行过滤:
filter(lambda x: x.last_check <= datetime.now() - timedelta(seconds = x.interval), MyModel.objects.all())
发布于 2010-09-13 14:39:59
对这种查询的支持正在进行中:http://code.djangoproject.com/ticket/10154
https://stackoverflow.com/questions/1734736
复制