Django 注释添加日期间隔

问题描述 投票:0回答:2

我正在使用带有 Django 2.2 的 postgres 数据库。我需要合并模型中的日期和时间字段,并在其中添加一天的间隔。我已经完成了这样的第一部分。

Model.objects.annotate(
    end_dt=models.ExpressionWrapper(
        models.F('date') + models.F('end'),
        output_field=models.DateTimeField()
    )
)

现在我必须在

end_dt
上添加 1 天。我已经用这样的普通sql完成了这个。

SELECT 
       "db_shift"."id",
       (("db_shift"."date" + "db_shift"."end") + INTERVAL '1 day') AS "end_dt"
FROM 
     "db_shift";

如何使用 django ORM 实现此目的?或者说是可以实现的吗?

python sql django postgresql annotations
2个回答
12
投票

经过一些实验,我发现从日期时间添加 timedelta 效果很好:)

import datetime


Model.objects.annotate(
    end_dt=models.ExpressionWrapper(
        models.F('date') + models.F('end') + datetime.timedelta(days=1),
        output_field=models.DateTimeField()
    )
)

0
投票

对于来到这里并寻找根据表本身的列添加间隔的方法的人,您可以按照以下步骤操作:

class MyModel(models.Model):
    quantity = ...
    created = ...


class Interval(Func):
    function = "INTERVAL"
    template = "(%(expressions)s * %(function)s '1' DAY)"

...

MyModel.objects.annotate(
    expiry_date=ExpressionWrapper(
        F("created") + Interval("quantity"),
        output_field=models.DateTimeField(),
    )
)

上面的代码将向

created
日期字段添加 N 天,其中 N 是
quantity
字段。

© www.soinside.com 2019 - 2024. All rights reserved.