【问题标题】:Django fetch model objects based on time with interval on the model itselfDjango根据时间和模型本身的间隔获取模型对象
【发布时间】:2009-11-14 16:30:55
【问题描述】:

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

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

【问题讨论】:

    标签: django models


    【解决方案1】:

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

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

    MyModel.objects.filter(expired__lte=current_date)
    

    然后在更新模型时:

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

    或类似的东西。

    【讨论】:

    • 感谢您的意见。这就是我最终得到的解决方案。
    【解决方案2】:

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

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

    【讨论】:

    • 这样做的问题是 Python filter() 调用将处理查询集中的所有项目,这可能会带来资源使用的开销(以及因此更多的处理时间)。最好将此类操作保留在数据库级别,即使它需要更多的编码工作。
    【解决方案3】:

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

    【讨论】:

    • 首先,这不是答案。其次,F('timestamp') + timedelta(...)(现在受支持)与datetime(...) + timedelta(minutes=F('minutes_diff')) 完全不同。问题是关于后者。
    猜你喜欢
    • 2016-05-13
    • 2011-06-07
    • 1970-01-01
    • 2022-08-02
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    相关资源
    最近更新 更多