Penurunan nilai model pada tengah malam di Django

Aug 17 2020

Saya ingin menurunkan nilai days_till_study dengan 1 setiap hari pada tengah malam.

Pendekatan saya saat ini tidak terlalu elegan. Apakah ada cara yang lebih baik untuk melakukan ini?

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

Terima kasih telah membaca ini.

Jawaban

1 Gram Aug 17 2020 at 10:11

Menghitung hasil dengan cepat

Jika Anda memiliki kendali atas apa yang harus disimpan dalam database, lebih baik menyimpan kedua hari di database dan menghitung perbedaan berdasarkan itu:

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

Penjadwalan melalui Celery

Jika Anda masih perlu melakukan sesuatu berdasarkan jadwal (seperti memperbarui days_till_studypada tengah malam) Anda dapat mencoba perpustakaan django-cron atau solusi berbasis Celery lainnya.

Penjadwalan melalui cron

Selain itu, Anda dapat membuat perintah manajemen dan menjalankannya berdasarkan jadwal melalui cron sistem .