在 Django ORM 中使用 MySQL CONVERT_TZ

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

我正在使用 CONVERT_TZ MySQL 函数在运行查询时将保存到数据库中的日期时间转换为其他时区。但由于后续步骤的性能问题,我想对 Django ORM 做同样的事情。下面是我正在做的代码。

boarding_stations = StationPoints.objects.filter(bus_id__in=bus_ids, station_id=sourceStation).annotate(coverted_timezone=Func(F('reachedTime'), '-08:00', '+05:30', function='CONVERT_TZ'))

上面的代码返回FieldError,因为它说

 Cannot resolve keyword '-08:00' into the field.
这个 MySQL 函数的正确使用方法是什么?

python django django-models django-queryset django-orm
1个回答
0
投票

Django ORM中的

Func
函数用于生成SQL函数供数据库引擎执行。目前,您正在尝试将
timezone
偏移值作为字符串文字传递,这是不可能的,因为 Django ORM 会将它们视为数据库字段名称,从而导致您看到的
FieldError

你可以使用

f-strings
所以:

from django.db.models import F, Func, Value
from django.db.models.functions import Cast, RawSQL

boarding_stations = StationPoints.objects.filter(bus_id__in=bus_ids, station_id=sourceStation).annotate(
    converted_timezone=RawSQL(
        f"CONVERT_TZ({Cast(F('reachedTime'), output_field=Value('datetime'))}, '-08:00', '+05:30')",
        ()
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.