Как создать новый токен с пользовательской датой в 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)