Как принудительно вставить пользовательское значение в datetimefield(auto_now_add=True) при создании объекта в Django?
У меня есть модель Test в эксплуатации A
class Test(models.Model):
some_field = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
Я переношу данные из модели другого сервиса B в эту модель (используя API).
Открыл API в сервисе A, который читает из POST данные, отправленные из B, и сохраняет данные в этой модели 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 сохраненного объекта - это текущее время. А не created_at, поступающее из API.
Как обойти сохранение текущего времени в этом сценарии и сохранить метку времени, поступающую из 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[.uuuuuuuuu]][TZ]).