首页 > 解决方案 > 在 Django 中午夜递减模型值

问题描述

我想每天在午夜将值 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

感谢您阅读本文。

标签: djangodjango-models

解决方案


即时计算结果

如果您可以控制在数据库中存储的内容,最好将两天都存储在数据库中并根据它计算差异:

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

通过 Celery 进行调度

如果您仍然需要按计划做某事(例如days_till_study在午夜更新),您可以尝试django-cron库或其他基于 Celery 的解决方案。

通过 cron 进行调度

此外,您可以创建管理命令并通过系统cron按计划运行它。


推荐阅读