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

