2

好吧,我的问题有点如下:

假设我有下一个模型,这是一个简单的案例:

class Period(models.Model):
    name = CharField(... field specs here ...)
    start_date = DateTimeField(... field specs here ...)
    duration = ... don't know what field should i use but this has to hold a delta ...

我想在 django 查询中检索 (start_date + duration) < now 的对象(我知道我可以在 python 中像 my_date_time + a_time_delta < datetime.now() 一样进行测试,但事实并非如此......我需要它作为查询的一部分)。

我怎么才能得到它?

4

3 回答 3

2

我认为您的快速回答是从您现在的日期时间中减去,而不是从模型日期时间中添加,如下所示:

.filter(start_date__lte=datetime.now()-timedelta(days=duration))
于 2013-07-16T19:34:23.593 回答
2

由于您的过滤器依赖于同一模型的两个属性,因此您需要为部件使用 ,F() expression同时duration将其与某种timedelta. 目前 Django ORM 不支持这一点。

不过,您可以使用extra()通话。这种方法的缺点是它与数据库无关。这是针对 PostgreSQL 的:

Period.objects.extra(
    where=["start_date + duration * INTERVAL '1 day' < %s"],
    params=[datetime.now()]
)

假设您的持续时间以天为单位。如果不是,请相应调整。

于 2015-11-25T12:31:31.823 回答
1

您可能希望避免extra在 Django ORM 查询中使用,因此您可以应用下一个解决方法:

1)添加计算字段并在每个模型的保存时更新它(您应该根据您的逻辑调整保存逻辑)

class Period(models.Model):
    name = CharField()
    start_date = DateTimeField()
    duration = IntegerField(help_text='hours')
    end_date = DateTimeField()

def save(self, *args, **kwargs):
    self.end_date = self.start_date + datetime.timedelta(days=self.duration)
    super(Period, self).save(*args, **kwargs)

2)然后在查询中使用计算字段:

finished = Period.objects.filter(end_date__lt=datetime.datetime.now())
于 2016-11-15T13:38:38.393 回答