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

Django 1.10中auto_now生成naive datetime引发警告的解决方法

解决Django 1.10中auto_now=True生成naive datetime的时区警告问题

这个问题我之前也碰到过,明明设置了auto_now=True还开了时区支持,结果还是收到naive datetime的警告,确实挺头疼的。咱们一步步来排查和解决:

1. 先确认项目时区配置是否正确

首先检查你的settings.py,确保这两个核心配置没问题:

USE_TZ = True
TIME_ZONE = 'Asia/Shanghai'  # 换成你实际业务用的时区,比如'UTC'

USE_TZ=True是开启Django时区支持的关键,TIME_ZONE要对应你业务所在的时区,Django会基于这个配置处理时间转换逻辑。

2. 检查模型字段定义是否有冲突

虽然你提到updated_at设置了auto_now=True,但要确保字段没有同时加default这类可能干扰的参数。正确的字段定义应该是这样的:

from django.db import models
import uuid

class BaseModel(models.Model):
    id = models.UUIDField(default=uuid.uuid4, primary_key=True)
    updated_at = models.DateTimeField(auto_now=True)
    # 其他字段...

    class Meta:
        abstract = True

如果你的字段同时写了default=datetime.now(),哪怕是无意的,都会和auto_now产生冲突,导致生成naive时间,所以一定要去掉default参数。

3. 手动实现auto_now逻辑(最可靠的兜底方案)

如果上面两步都没问题但警告还存在,那大概率是Django 1.10的小场景bug——某些情况下auto_now没有正确调用时区感知的时间函数。这时候我们可以手动在模型的save方法里控制updated_at,用timezone.now()确保生成aware datetime:

from django.db import models
from django.utils import timezone
import uuid

class BaseModel(models.Model):
    id = models.UUIDField(default=uuid.uuid4, primary_key=True)
    updated_at = models.DateTimeField()  # 这里去掉auto_now=True

    def save(self, *args, **kwargs):
        # 每次保存时强制更新为当前时区感知的时间
        self.updated_at = timezone.now()
        super().save(*args, **kwargs)

    class Meta:
        abstract = True

timezone.now()会在USE_TZ=True时自动返回带时区信息的datetime,完美解决naive时间的问题。

4. 注意批量更新的特殊场景

如果你用QuerySet.update()做批量更新,这时候模型的save方法不会被触发,auto_now自然也不会生效。这时候需要手动传入timezone.now():

from django.utils import timezone

# 批量更新时手动设置aware datetime
Item.objects.filter(status='active').update(updated_at=timezone.now())

这样操作后,应该就能彻底消除那个烦人的RuntimeWarning了。

内容的提问来源于stack exchange,提问作者user2880391

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:02:20