Django DateTimeField时间戳格式无效问题求助
问题分析与解决建议
环境信息
- Django 4.0(虚拟环境)
- Python 3.8
- Postgres 15
- Elementary OS 6.1
核心问题
你的MyModel在保存时,created/updated字段被传入了毫秒级时间戳(如1669827388000),导致Django的DateTime字段格式验证失败。哪怕使用auto_now_add/auto_now或自定义save方法,错误依然存在,主要有几个明显的问题点需要优先修复:
1. 视图里的变量名笔误(致命错误)
看你提供的视图代码:
@api_view(['GET']) def dummy_view(request): new_record = MyModel( other_field=True ) new_token.save() # 这里写错了!
你创建的对象是new_record,但保存的是new_token——这个new_token大概率是其他地方的变量,可能带有时间戳格式的created/updated值,直接导致了验证错误。立刻改成new_record.save()。
2. 自定义save方法的父类调用错误
你修改后的模型里,save方法写了:
return super(Token, self).save(*args, **kwargs)
但你的模型类是MyModel,不是Token!这个错误会导致父类的save逻辑没有正确执行,甚至可能触发其他模型的逻辑,直接引发字段值异常。修复成:
return super(MyModel, self).save(*args, **kwargs) # 或者Python3+直接写super().save(*args, **kwargs)
3. 排查是否有外部传入时间戳值
如果用了DRF的序列化器,检查是否把created/updated字段暴露给了前端,导致外部传入了时间戳。正确的做法是把这两个字段设为只读:
class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = ['other_field', 'created', 'updated'] read_only_fields = ['created', 'updated'] # 禁止外部修改
4. 回到初始模型并确保迁移生效
如果自定义save方法容易出错,建议先回到最初的auto_now_add/auto_now配置,这是Django官方推荐的自动维护时间字段的方式:
class MyModel(models.Model): other_field = models.BooleanField() created = models.DateTimeField(auto_now_add=True) # 创建时自动赋值 updated = models.DateTimeField(auto_now=True) # 每次保存自动更新
然后执行迁移,确保数据库字段的默认值配置正确:
python manage.py makemigrations python manage.py migrate
5. 排查信号或中间件干扰
检查项目中是否有pre_save信号或者其他中间件,在保存前给created/updated字段赋值了时间戳。如果有,修改这些逻辑,确保传入的是datetime对象而非时间戳字符串/数字。
按以上步骤逐一排查修复,应该能解决时间戳格式验证的问题。
内容的提问来源于stack exchange,提问作者Lopofsky
相关产品推荐
相关产品推荐

