【问题标题】:Query Expired Time Difference in Django ORM在 Django ORM 中查询过期时间差
【发布时间】:2011-12-11 02:40:14
【问题描述】:

我有一个简单的模型来描述任务和任务执行之间的时间段:

class Task(models.Model):
    last_check_timestamp = models.DateTimeField(blank=True, null=True, db_index=True)

class TaskSchedule(models.Model):
    task = models.OneToOneField(Task, blank=False, null=False, related_name='schedule')
    interval_seconds = models.IntegerField(blank=False, null=False)

我希望能够使用 Django 的 ORM 查询哪些任务是新鲜的,哪些是陈旧的,这意味着那些应该按照他们的计划运行。

我目前正在通过以下方式为没有 ORM 的特定记录计算此值:

import datetime
task = Task.objects.get(id=123)
fresh = task.last_check_timestamp is not None and datetime.datetime.now() < (task.last_check_timestamp + datetime.timedelta(seconds=task.schedule.interval_seconds))

我将如何使用 Django 的 ORM 做同样的事情,这样我就可以一次查询所有新鲜/陈旧的任务?

例如这显然行不通,但类似于:

Tasks.objects.filter(Q(last_check_timestamp__isnull=True) || Q(last_check_timestamp + datetime.timedelta(seconds=schedule__interval_seconds)))

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    我最近不得不做一个类似的查询。我希望使用 F() 对象来做到这一点,但我认为这是不可能的,因为 timedelta 依赖于一个 db 列(如果 schedule_interval_seconds 是一个常量,这是可能的)。

    最后,我使用带有extra() 的ORM 进行了查询,并为where 子句编写了SQL。

    sql = "DATE_ADD(last_check_timestamp, INTERVAL schedule.interval_seconds SECOND) < DATE(NOW())"
    Tasks.objects.filter(Q(last_check_timestamp__isnull=True) || Q(last_check_timestamp + datetime.timedelta(seconds=schedule__interval_seconds)))
    tasks = Task.object.select_related('schedule').extra(where=[sql,]
    

    这使用DATE_ADD 函数(MySQL docs)。您可能需要针对不同风格的 SQL 进行调整。 select_related 是必需的,以便 Django 连接到调度表。

    上面没有选择last_check_timestamp为空的任务。我认为您不能使用组合 extra() 和您的 Q 对象,但您可以扩展 SQL 语句。

    sql = """last_check_timestamp is NULL or DATE_ADD(last_check_timestamp, INTERVAL schedule.interval_seconds SECOND) < DATE(NOW())"""
    

    【讨论】:

    • 有趣。我正在考虑的另一个解决方案是通过简单地实现下一次执行的日期时间来摆脱 timedelta。然后按具体化的日期时间过滤。
    猜你喜欢
    • 2021-12-24
    • 2019-05-12
    • 2019-01-12
    • 2016-11-11
    • 2020-01-17
    • 2021-10-30
    • 2011-08-07
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多