在 Django 中创建对象时如何强制在 datetimefield(auto_now_add=True) 中插入自定义值?

问题描述 投票:0回答:1

我有一个模型

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 的时间戳?

django api django-models django-views django-forms
1个回答
3
投票

当你有

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

© www.soinside.com 2019 - 2024. All rights reserved.