Django注释:日期加上时间间隔

9

我正在使用Django 2.2与PostgreSQL数据库。我需要在模型中组合日期和时间字段,并增加一天的时间间隔。我已经完成了第一部分,操作如下:

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 实现这个功能?或者说这个功能是否可行?

dateend的字段类型是什么?在模型中,两者都是DateTimeField吗?您能展示一下相关模型的部分内容吗? - JPG
@JPG dateDateField,而 endTimeField - Nafees Anwar
2个回答

12

经过一些尝试,我发现从datetime添加timedelta完全没有问题 :)

import datetime


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

如果您的间隔取决于其他表列,这种方法将无法奏效。 - Mourad Qqch

2

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

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字段的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接