如何在Django F表达式中将日期和时间字段合并为DateTime字段

时间:2019-06-17 12:49:28

标签: django postgresql django-models django-rest-framework django-orm

我必须得到两个datetime字段的差,但是一个是纯日期时间字段,另一个是日期和时间的组合。 我尝试了这个:

    qs = Foo.objects.filter(
        bar__baz_id=self.kwargs['baz_pk'],
    )
    start_datetime = ExpressionWrapper((F('x__date') + F('x__start')), output_field=DateTimeField())
    qs = qs.annotate(start_datetime=start_datetime)
    before_start_wrapper = ExpressionWrapper(
        F('start') - F('start_datetime'),   # 'start' is datetime field on Foo, start_datetime is annotated field on Foo
        output_field=DateTimeField()
    )
    before_start = Extract(before_start_wrapper, 'epoch')
    qs = qs.annotate(before_start=before_start/3600)

这也不起作用;

    qs = Foo.objects.filter(
        bar__baz_id=self.kwargs['baz_pk'],
    )
    start_datetime = F('x__date') + F('x__start')

    before_start_wrapper = ExpressionWrapper(
        F('start') - F(start_datetime), # 'start' is datetime field on Foo, start_datetime is combined F expression
        output_field=DateTimeField()
    )
    before_start = Extract(before_start_wrapper, 'epoch')
    qs = qs.annotate(before_start=before_start/3600)

django的作用如下:

...(EXTRACT('epoch' FROM "foo".came" - ("db_shift"."date" + "db_shift"."start")) AT TIME ZONE) /3600 AS ...

我期望的是:

...(EXTRACT('epoch' FROM "foo".came" - ("db_shift"."date" + "db_shift"."start")AT TIME ZONE)) / 3600 AS ...

有人可以提供Django ORM解决方案吗?我知道我可以运行原始查询,但想查看是否可以使用Django ORM进行相同的操作?

谢谢。

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题并得到了答案。仅需要DurationField()的{​​{1}}参数中的output而不是ExpressionWrapper。这是代码:

DateTimeField()

这样,我就可以管理以前遇到的问题。这可能对其他人有帮助。