我的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小时前。
答案 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
而非仅数小时。