Как изменить значение поля Model с помощью логики на время
Допустим, у меня есть модель с именем Quote
class Quote(models.Model):
# date_validity will have persistent data like this 2023-11-30 15:00
date_validity = models.CharField(max_length=100, blank=True)
quote_status = models.CharField(
max_length=150, default='active')
Итак, мне нужно установить статус quote_status expired, если data_validity соответствует текущему времени, Если срок действия через 2 дня, то котировка должна истечь, если срок действия истек.
Как я могу управлять этим автоматически? Насколько я знаю, метод self.save() не срабатывает автоматически. Есть предложения по решению этой проблемы?
Я полагаю, что это невозможно, пока мы не будем вызывать функцию периодически, как в celery. Есть ли другой способ сделать это?
Please use a DateTimeField [Django-doc], not a CharField to store a timestamp. As for the status, you should not store this in the model. You can determine this when necessary, for example with a property, or with a .annotate(…) [Django-doc] to check the status.
Действительно, вы можете определить модель с:
from django.utils.timezone import now
from datetime import timedelta
class Quote(models.Model):
created = models.DateTimeField()
@property
def status(self):
return 'active' if self.created >= now()-timdelta(days=2) else 'expired'
и вы можете, например, получить все активные и просроченные кавычки с помощью:
from django.db.models.functions import Now
from datetime import timedelta
active = Quote.objects.filter(created__gte=Now()-timedelta(days=2))
expired = Quote.objects.filter(created__lt=Now()-timedelta(days=2))