Python 在Django ORM中查询过期时差

Python 在Django ORM中查询过期时差,python,django,django-orm,Python,Django,Django Orm,我有一个简单的模型来描述任务和任务执行之间的时间: 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='

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

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))

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

最后,我使用ORM with进行了查询,并为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,]

有趣。我正在考虑的另一个解决方案是通过简单地具体化下一次执行的日期时间来消除时间差。然后根据具体化的日期时间进行过滤。
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,]
sql = """last_check_timestamp is NULL or DATE_ADD(last_check_timestamp, INTERVAL schedule.interval_seconds SECOND) < DATE(NOW())"""