如何在Django的查询中总结两列

时间:2017-04-03 17:15:51

标签: django postgresql django-models django-queryset

我的postgresql数据库中有以下模型:

s3.listBuckets(function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

我需要从数据库网址获取需要根据当前时间下载的数据库网址,以及上次运行的时间是否高于频率。

我设法创建原始查询,但我无法在Django Queryset中创建它。

以下是以下查询:

class UrlXML(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, db_index=True)
    url = models.TextField()
    is_active = models.BooleanField(default=True, db_index=True)
    run_last_time = models.DateTimeField(blank=True, null=True)
    run_frequency = models.IntegerField(default=24)

示例:

当前时间是2017-04-03 11:00:00

我在数据库中有两个网址:

网址 - 答:上一次应用2017-04-03 08:00:00,其频率为6小时

网址B:上次时间是2017-04-02 11:00:00,其频率为24小时

当我在2017-04-03 11:00:00(在+和 - 30分钟的范围内)执行该功能时,它必须仅为我带来Url B,并导致它最后一次运行是24小时前。

2 个答案:

答案 0 :(得分:0)

我设法在Queryset中使用extra来找到解决方案。

这是:

UrlXML.objects.filter(is_active=True).extra(
    where={"run_last_time + INTERVAL '1 hours' * run_frequency <= NOW()"}
)

我不知道这是否是最好的方法,但这是我唯一能找到的方法。

如果有更好的方法,我愿意接受建议。

答案 1 :(得分:0)

如果您稍微更改模型,可以使用Query Expressions

# models.py
class UrlXML(models.Model):
    ...
    run_frequency = models.DurationField(default=timedelta(hours=24))
UrlXML.objects \
    .annotate(expires=ExpressionWrapper(
        F('run_last_time') + F('run_frequency'),
        output_field=DateTimeField())) \
    .filter(expires__lte=datetime.now())

此解决方案也更加强大,因为您可以使用datetime.timedelta而非仅数小时。