You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用update更新模型时数据库存储错误时间的问题

问题原因

你传入的datetime.datetime(2023,6,1,11,52)是无时区感知(naive)的datetime对象,而Django在使用QuerySet.update()方法时,不会自动将本地时区的naive时间转换为UTC时间存储——它会直接把这个naive时间当作UTC时间存入数据库。你的时区是UTC+3:30,所以数据库里的UTC时间08:22加上3.5小时就是你传入的11:52,这就是时间偏差的根源。

另外,你的模型字段默认值写法存在问题:default=timezone.localtime(timezone.now())会在模型加载时就计算一次默认值,而非每次创建对象时动态生成,这可能导致后续创建的对象使用过时的默认时间。

解决步骤

1. 传入带时区感知的datetime对象

构造new_字典时,给datetime对象添加你的时区信息,让Django自动处理时区转换:

from datetime import datetime
from django.utils import timezone

# 创建带时区感知的datetime对象
aware_datetime = timezone.make_aware(
    datetime(2023, 6, 1, 11, 52),
    timezone.get_current_timezone()
)

new_ = {
    'symbol': <Symbols: btc>,
    'status': 'o',
    'side': 'l',
    'open_date': aware_datetime,
    'entry_price': '995945994564156'
}
journal.update(**new_)

也可以直接用pytz指定时区:

import pytz
tehran_tz = pytz.timezone('Asia/Tehran')  # UTC+3:30对应伊朗时区
aware_datetime = tehran_tz.localize(datetime(2023, 6, 1, 11, 52), is_dst=None)

2. 修正模型字段的默认值

将open_date的默认值改为动态计算的可调用对象,确保每次创建对象时生成最新时间:

from django.utils import timezone

open_date = models.DateTimeField(
    default=lambda: timezone.localtime(timezone.now()),
    editable=False
)
# 若希望默认值存储UTC时间,可简化为:
# open_date = models.DateTimeField(default=timezone.now, editable=False)

3. 确认Django时区配置

检查settings.py中的时区相关配置是否正确:

TIME_ZONE = 'Asia/Tehran'  # 替换为你实际使用的UTC+3:30时区
USE_TZ = True

USE_TZ=True是开启时区自动转换的关键配置。

备选方案:手动转换为UTC时间

如果必须使用无时区感知的datetime对象,可手动转换为UTC后再传入:

import pytz
from datetime import datetime

tehran_tz = pytz.timezone('Asia/Tehran')
naive_datetime = datetime(2023, 6, 1, 11, 52)
utc_datetime = tehran_tz.localize(naive_datetime).astimezone(pytz.utc)

new_['open_date'] = utc_datetime
journal.update(**new_)

内容的提问来源于stack exchange,提问作者Amir mohammad Sedaghat nia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:22:44