【问题标题】:How to sum two columns in query on Django如何在Django上的查询中对两列求和
【发布时间】:2017-08-28 16:07:27
【问题描述】:

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

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)

每个小时我都需要从需要下载的数据库 url 获取基于我当前时间的时间,如果上次运行的时间高于频率。

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

这是以下查询:

select (run_last_time + INTERVAL '1 hours' * run_frequency), run_frequency, NOW(), run_last_time from urlxml where is_active=True and (run_last_time + INTERVAL '1 hours' * run_frequency) <= NOW();

例子:

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

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

Url A: Ran last time 2017-04-03 08:00:00,频率为6小时

Url B: Ran last time 2017-04-02 11:00:00,频率为24小时

当我在 2017-04-03 11:00:00(在 + 和 - 30 分钟的范围内)执行该函数时,它必须只给我带来 Url B,因为它最后一次运行是 24 小时以前。

【问题讨论】:

    标签: django postgresql django-models django-queryset


    【解决方案1】:

    我设法使用查询集中的额外内容找到了解决方案。

    这里是:

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

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

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

    【讨论】:

    【解决方案2】:

    如果你要稍微改变你的模型,你可以使用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 而不是仅使用小时数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2018-05-06
      • 2013-01-30
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多