首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Django根据模型本身的时间间隔来获取模型对象

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

Stack Overflow用户
提问于 2009-11-15 00:30:55
回答 3查看 2.6K关注 0票数 3

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

该模型如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
MyModel(models.Model):
    owner = models.ForeignKey(User)
    last_check = models.DateTimeField(blank=True, null=True)
    interval = models.IntegerField(default=1800)

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

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

代码语言:javascript
代码运行次数:0
运行
复制
time_diff = datetime.now() - timedelta(seconds=1800)
MyModel.object.filter(last_check__lte=time_diff)

但是,当间隔在模型本身时,我不知道该如何做。这是我尝试过的:

代码语言:javascript
代码运行次数:0
运行
复制
objects_to_check = MyModel.objects.filter(
                                        last_check__isnull=False
                                    ).filter(
                                        last_check__lte=datetime.now() - timedelta(seconds=F('interval'))
                                    )

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

代码语言:javascript
代码运行次数:0
运行
复制
unsupported type for timedelta seconds component: F

你知道怎么解决这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-15 01:43:47

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

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

代码语言:javascript
代码运行次数:0
运行
复制
MyModel.objects.filter(expired__lte=current_date)

然后在更新模型时:

代码语言:javascript
代码运行次数:0
运行
复制
def save(self):
    self.expired = datetime.now() + self.interval;

或者类似的东西。

票数 3
EN

Stack Overflow用户

发布于 2009-11-15 19:20:55

Python表示对Python查询中的模型字段的引用,因此不能使用它初始化F对象。您可以使用extra方法编写特定于数据库的查询,也可以只在Python级别对其进行过滤:

代码语言:javascript
代码运行次数:0
运行
复制
filter(lambda x: x.last_check <= datetime.now() - timedelta(seconds = x.interval), MyModel.objects.all())
票数 0
EN

Stack Overflow用户

发布于 2010-09-13 22:39:59

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1734736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档