【发布时间】:2021-11-07 19:22:25
【问题描述】:
我在我的 Django Rest Framework 项目中使用令牌身份验证。我注意到,在创建令牌时,如果我在 create 方法中指定 created 日期时间字段,则不会使用该值创建令牌,例如:
new_token = Token.objects.create(user=user, created=datetime(2021, 9, 7, 10, 10, 10, tzinfo=timezone.utc)
不会使用指定的日期时间创建令牌,而是使用当前的 UTC 时间。为了使它工作,我必须对这个对象执行另一个操作并再次保存修改后的对象,如下所示:
new_token = Token.objects.create(user=user)
new_token.created = datetime(2021, 9, 7, 10, 10, 10, tzinfo=timezone.utc)
new_token.save()
我认为这将在数据库上进行两个查询,首先是在创建时,然后在修改创建的日期时间时,这不是很优雅。有人可以告诉我为什么 Django 没有以第一种方式设置日期时间吗?我对这个框架很陌生,所以如果我在这里忽略了一些非常简单的东西,请原谅我。
谢谢!
【问题讨论】:
-
请问为什么不在
Token对象的created字段上使用default=timezone.now参数?那么你不需要经历这一切来开始 -
对于
DateTimeField,你也可以像这样使用auto_now_add参数:created_date = models.DateTimeField(auto_now_add=True) -
@DavidCulbreth 感谢您的意见。实际上,我已经稍微修改了 Token Authentication 的行为,并想为它编写单元测试。在某些情况下,我需要在测试中模拟创建的日期时间。我找不到令牌身份验证设置我可以模拟的创建日期时间的源代码,因此,我唯一的选择是自己设置它,然后模拟那个日期时间。我说得有道理吗?或者你能给我指出一个更好的解决方案吗?
标签: django django-rest-framework django-authentication http-token-authentication