如何在 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] 格式).