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
相关产品推荐
相关产品推荐

