Django模型无法将Python datetime写入MySQL带时区Timestamp字段求助
我之前踩过几乎一模一样的坑,给你几个针对性的排查和解决思路:
先确认最容易忽略的点:有没有调用
save()?
Django模型实例的属性修改只是在内存层面,必须显式调用listing.save()才能把变化同步到数据库。如果只做了赋值操作却没调用save,数据库自然不会有任何更新。检查字段名是否匹配!
你模型里定义的字段是listing_modify_date,但代码里赋值用的是listing.modify_date——这明显是字段名写错了!Django只会把模型中定义的字段属性同步到数据库,你现在赋值的是一个模型不存在的modify_date属性,完全不会影响到数据库里的listing_modify_date字段。把赋值语句改成listing.listing_modify_date = datetime.now()再试试。排查模型save方法或信号的干扰
如果你重写了模型的save()方法,或者注册了pre_save/post_save信号,可能在这些逻辑里覆盖了listing_modify_date的取值,导致你手动赋值的内容被冲掉。可以暂时注释掉自定义的save方法或信号,测试赋值是否能正常同步到数据库。针对时区的适配(针对PostgreSQL场景)
你提到用pgAdmin执行SQL能成功,而Django赋值不行,如果你实际用的是PostgreSQL(而非描述里的MySQL),那可能是时区问题:datetime.now()返回的是不带时区的naive datetime对象,而PostgreSQL的timestamp with timezone字段需要带时区的datetime。可以改用Django自带的timezone.now()(记得先从django.utils import timezone),生成带时区的时间对象后再赋值。检查事务状态
如果你的代码运行在事务块中,且事务没有提交,数据库也不会显示更新结果。可以确认代码是否在事务上下文里,或者手动调用transaction.commit()(从django.db import transaction)来提交事务。
你可以先优先检查字段名和save方法这两个点,大概率能解决问题。
内容的提问来源于stack exchange,提问作者Andrew

