如何在 Django 中创建对象时强制在 datetimefield(auto_now_add=True) 中插入自定义值?
How to force insert custom value in datetimefield(auto_now_add=True) while object creation in Django?
我有一个型号 Test
正在服役 A
class Test(models.Model):
some_field = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
我正在将数据从另一个服务 B
的模型迁移到此模型(使用 APIs)。
在服务 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
时,你强制你的记录将当前时间作为它们在创建时间的时间戳,如果你尝试向它传递一个值,Django 会在创建时刻简单地忽略这个字段(第一次在你的对象上调用 Test.objects.create()
或调用 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] 格式).
我有一个型号 Test
正在服役 A
class Test(models.Model):
some_field = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
我正在将数据从另一个服务 B
的模型迁移到此模型(使用 APIs)。
在服务 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
时,你强制你的记录将当前时间作为它们在创建时间的时间戳,如果你尝试向它传递一个值,Django 会在创建时刻简单地忽略这个字段(第一次在你的对象上调用 Test.objects.create()
或调用 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] 格式).