我正在使用 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 函数的正确使用方法是什么?
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')",
()
)
)