Как создать новый токен с пользовательской датой в Django Rest Framework?

Я использую аутентификацию по токенам в своем проекте Django Rest Framework. Я заметил, что при создании токена, если я указываю поле created datetime в методе create, то токен не создается с этим значением, например:

new_token = Token.objects.create(user=user, created=datetime(2021, 9, 7, 10, 10, 10, tzinfo=timezone.utc)

не создаст токен с указанным временем, а будет использовать текущее время UTC. Чтобы заставить его работать, я должен выполнить другую операцию над этим объектом и снова сохранить измененный объект следующим образом:

new_token = Token.objects.create(user=user) 
new_token.created = datetime(2021, 9, 7, 10, 10, 10, tzinfo=timezone.utc)
new_token.save()

Я думаю, что это сделает два запроса к БД, сначала при создании, а затем при изменении созданного datetime, что не очень элегантно. Может ли кто-нибудь сказать мне, почему Django не устанавливает время даты первым способом? Я очень новичок в этом фреймворке, поэтому прошу простить меня, если я упускаю из виду что-то очень простое.

Спасибо!

Хорошо, я понял, почему такое поведение Token. Если посмотреть код модели Token, то создаваемое поле определяется следующим образом:

created = models.DateTimeField(_("Created"), auto_now_add=True)

Значение auto_now_add=True указывает, что это поле будет автоматически установлено на текущее время UTC.

Теперь, что я хотел сделать, так это сымитировать это созданное время в моих модульных тестах для имитации некоторых случаев. Я обнаружил, что вы можете просто подражать возвращаемому значению django.utils.timezone.now для имитации любого созданного времени суток следующим образом:

def my_unit_test(self):
   with patch('django.utils.timezone.now') as fake_dt:
       fake_dt.return_value = datetime(2021, 9, 7, 10, 10, 10, tzinfo=timezone.utc)
       # token's created field will be set to the datetime above
       token = Token.objects.create(user=test_user)

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