Поля модели Django не являются динамическими

У меня есть это в моих моделях.

class School(models.Model):
    subscribed = models.BooleanField(default=True)
    invoice_date = models.DateField()
    remaining_days = models.IntegerField(default=30)
    
    def save(self,*args,**kwargs):
        self.remaining_days = (self.invoice_date  - date.today()).days
        if self.invoice_date <= date.today():
            self.subscribed=False
        else:
            self.subscribed=True
        return super().save(*args,**kwargs)

Проблема в том, что оставшиеся дни не меняются динамически. Я думал, что так и будет, когда кодировал это. Как я могу сделать так, чтобы он менялся каждый новый день?

Метод save будет срабатывать один раз при каждом обновлении модели. Django не будет автоматически запускать save каждый раз, когда выполняется код, это очень плохо скажется на производительности.

Вероятно, вы не хотите использовать метод сохранения, чтобы автоматически сделать это за вас. Я бы сказал, что вам нужна запланированная операция, которая каждый день выполняется в определенное время и проходит по экземплярам, обновляя их оставшиеся дни

Тем не менее, оставшиеся дни, похоже, являются вычисляемым полем. Возможно, вам не нужно хранить его в базе данных, поскольку, зная, какой сегодня день и какая дата счета-фактуры, вы можете каждый раз, когда захотите, просто обращаться к моделям и выполнять расчет. Набор запросов мог бы отфильтровать для вас все заинтересованные экземпляры без необходимости обновлять оставшиеся дни каждый день.

School.objects.filter(invoice_date__lte=datetime.now()-timedelta(days=5))

Таким образом, вы всегда можете видеть, какие из них близки к крайнему сроку, без необходимости хранить вычисляемое поле.

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