Đang giảm giá trị mô hình lúc nửa đêm ở Django

Aug 17 2020

Tôi muốn giảm giá trị days_till_study xuống còn 1 ngày vào lúc nửa đêm.

Cách tiếp cận hiện tại của tôi không được thanh lịch cho lắm. Có cách nào tốt hơn để làm điều này?

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

Cảm ơn vì đã đọc cái này.

Trả lời

1 Gram Aug 17 2020 at 10:11

Đang tính toán kết quả

Nếu bạn có quyền kiểm soát những gì cần lưu trữ trong cơ sở dữ liệu, tốt hơn nên lưu trữ cả hai ngày trong cơ sở dữ liệu và tính toán sự khác biệt dựa trên nó:

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

Lên lịch qua Celery

Nếu bạn vẫn cần làm điều gì đó theo lịch trình (như cập nhật days_till_studylúc nửa đêm), bạn có thể thử thư viện django-cron hoặc một giải pháp dựa trên Cần tây khác.

Lập lịch qua cron

Ngoài ra, bạn có thể tạo một lệnh quản lý và chạy nó theo lịch trình thông qua cron hệ thống .