Уменьшение значения модели в полночь в Django

Aug 17 2020

Я хочу уменьшить значение days_till_study на 1 каждый день в полночь.

Мой нынешний подход не очень элегантен. Есть лучший способ сделать это?

from django.db import models
from django.utils import timezone
    
class Card(models.Model):
    question = models.CharField(max_length=100)
    answer = models.TextField()
    date = models.DateTimeField(default=timezone.now)
    creator = models.ForeignKey(User, on_delete=models.CASCADE)
    decks = models.ManyToManyField(Deck)
    days_till_study = models.IntegerField(default=1)

    def __str__(self):
        return self.question

    def decrement_days_till_study(self):
        if days_till_study < 1:
            x = str(datetime.datetime.now())
            if x[x[11:26]] == '00:00:00.000000':
                days_till_study += 1

Спасибо, что прочитали это.

Ответы

1 Gram Aug 17 2020 at 10:11

Подсчет результата на лету

Если у вас есть контроль над тем, что хранить в базе данных, лучше сохранить оба дня в базе данных и рассчитать разницу на ее основе:

class Card(models.Model):
    created_at = models.DateTimeField()
    study_at = models.DateTimeField()

    @property
    def days_till_study(self):
        return (self.study_at - self.created_at).days

Планирование через сельдерей

Если вам все еще нужно что-то делать по расписанию (например, обновление days_till_studyв полночь), вы можете попробовать библиотеку django-cron или другое решение на основе Celery.

Планирование через cron

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