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

如何在Django Rest Framework中创建指定created时间的自定义Token

核心原因

DRF 内置的 Token 模型的 created 字段在定义时开启了 auto_now_add=True 属性,这是 Django 框架层面的规则:只要模型字段设置了 auto_now_add=True,调用 objects.create() 方法创建实例时,主动传入的该字段值会被直接忽略,系统会强制使用当前UTC时间填充该字段,这就是你第一种写法不生效的根本原因。

最优解决方案(仅执行1次数据库查询)

不需要拆分创建和修改两步,直接构造实例后保存即可绕开 auto_now_add 的限制:

new_token = Token(
    user=user, 
    created=datetime(2021, 9, 7, 10, 10, 10, tzinfo=timezone.utc)
)
new_token.save(force_insert=True)

该写法只会执行一次INSERT操作,和直接调用create的性能完全一致,同时可以保留你自定义的created时间。

补充拓展说明

如果你的场景需要兼容用户已有Token的情况,可使用update_or_create方法:

token, created = Token.objects.update_or_create(
    user=user,
    defaults={"created": datetime(2021, 9, 7, 10, 10, 10, tzinfo=timezone.utc)}
)

这种写法会自动判断用户是否已有Token:如果没有就用你指定的时间创建新Token,如果有就将已有Token的created时间更新为你指定的值,逻辑更健壮。

相关基础知识点

Django模型时间字段两个常用自动赋值参数的生效规则:

  • auto_now_add=True:仅在实例第一次插入数据库时自动赋值为当前时间,创建时主动传入的字段值无效,后续修改实例时不会自动更新该字段
  • auto_now=True:每次实例调用save()方法时自动更新为当前时间,任何阶段主动传入的该字段值都会被忽略

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:39:01