我有一个模型
Test
正在使用A
class Test(models.Model):
some_field = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
我正在将数据从不同服务
B
的模型迁移到此模型(使用 API)。
在服务 A
中公开了一个 API,它读取从 B
发送的 POST 数据,并将数据保存在此 Test
模型中。
来自服务的示例数据
B
data = {
'some_field': 5,
'created_at': '2013-06-26 00:14:27.260524',
}
现在,当我使用以下方法将此数据保存在数据库中时:
obj = Test(
some_field=request.POST.get('some_field'),
created_at=request.POST.get('created_at'),
)
obj.save()
保存对象的
created_at
值是当前时间。不是来自 API 的 created_at
。
在这种情况下如何绕过当前的时间节省并在创建对象时保存来自 API 的时间戳?
当你有
auto_now_add=True
时,你会强制你的记录在创建时使用当前时间作为时间戳,如果你尝试向它传递一个值(无论是在调用 Test.objects.create()
时),Django 在创建时会简单地忽略该字段或者第一次在你的对象上调用 save
方法)。我认为你可以通过两种不同的解决方案来解决这个问题(也可能有其他解决方案):
A- 尝试将字段值从
auto_now_add=True
更改为 default=timezone.now
:
from django.utils import timezone
class Test(models.Model):
some_field = models.IntegerField()
created_at = models.DateTimeField(default=timezone.now)
然后您可以在创建过程中为您的
created_time
传递一个值。
B- 如果这只是一次性导入(或多次访问数据库不会对性能产生不良影响),您可以尝试在创建部分后更新每个实例:
obj = Test(some_field=request.POST.get('some_field'))
obj.save()
obj.created_at = request.POST.get('created_at')
obj.save(update_fields=['created_at'])
注意: 确保您的
request.POST.get('created_at')
是有效的日期时间格式,否则 Django 将引发异常(必须采用 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 格式) .