Как принудительно вставить пользовательское значение в 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]).

Вернуться на верх