Django查询:“datetime + delta”作为表达式

时间:2013-07-16 19:28:14

标签: python sql django datetime timedelta

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

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

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

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

我怎么能得到它?

3 个答案:

答案 0 :(得分:2)

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

.filter(start_date__lte=datetime.now()-timedelta(days=duration))

答案 1 :(得分:2)

由于您的过滤器取决于同一型号的两个属性,因此您需要为<% content_for :rating_code do %> $('#average_rating').raty({ path: '', readOnly: true, score: <%= @project.average_rating %> }); <% end %> 部分使用F() expression,同时将其与某种duration组合使用。目前Django ORM不支持。

但是,您可以使用timedelta来电。这种方法的缺点是它不是数据库无关的。这适用于PostgreSQL:

extra()

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

答案 2 :(得分:1)

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

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