Проверить, была ли модель недавно обновлена, не удается при попытке использовать временную дельту
У меня есть следующая модель, которая сохраняет время даты при сохранении:
class StockInfo(models.Model):
ticker = models.CharField(max_length=100)
current_price = models.FloatField()
name = models.CharField(max_length=255)
summary = models.TextField()
sector = models.CharField(max_length=100)
dividends = models.ArrayField(model_container=Dividend)
last_updated_time = models.DateTimeField(null=True)
objects = models.DjongoManager()
# https://stackoverflow.com/questions/9953427/django-custom-save-model
def save(self, *args, **kwargs):
self.last_updated_time = datetime.datetime.now().astimezone()
super(StockInfo, self).save(*args, **kwargs)
В представлении я пытаюсь использовать временную дельту, чтобы определить, была ли модель обновлена в течение последней минуты:
the_timedelta = stock.last_updated_time.replace(tzinfo=None) - now
print(the_timedelta)
if the_timedelta > datetime.timedelta(minutes=1):
print("stock was updated within the last minute")
else:
print("stock hasn't been updated recently")
Я ожидал, что он определит эти быстрые обновления в течение минуты:
found the stock
the last updated time for stock good before save: 08/15/2022 07:51:09
-1 day, 23:59:31.335919
stock hasn't been updated recently
the last updated time for stock good after save: 08/15/2022 07:51:38
обратное сравнение с if the_timedelta < datetime.timedelta(minutes=1):
приводит к противоположной ошибке:
the last updated time for stock stag before save: 08/15/2022 07:51:37
-1 day, 23:50:47.073490
stock was updated within the last minute
the last updated time for stock stag after save: 08/15/2022 08:00:50
Я хотел бы иметь возможность определить, был ли объект акции сохранен в течение последних 60 секунд, и если да, то мне не нужно делать еще один запрос API так скоро
Причина, по которой сравнение timedelta не работает так, как ожидалось, заключается в том, что расчет разницы дат выполняется неправильно, поэтому результат -1 день. Должно быть так:
now - stock.last_updated_time.replace(tzinfo=None)
Дататайм now
должен быть больше времени последнего обновления и давать ответ в минутах/секундах, который можно сравнить с timedelta.
the_timedelta = now - stock.last_updated_time.replace(tzinfo=None)
print(the_timedelta)
# https://stackoverflow.com/questions/12484003/what-is-the-best-way-to-check-if-time-is-within-a-certain-minute
if the_timedelta < datetime.timedelta(minutes=5):
print("stock was updated within the last 5 minutes...no need to make an api call")
current_price = stock.current_price
else:
print("stock hasn't been updated recently, make api call")
current_price = get_recent_price_or_database_saved_price(ticker=ticker, stock=stock)