在 Django 中使用芹菜安排状态变化

Scheduling a satutus change using celery in django

在我的程序中,我安排了一项任务,如果到期日等于我 [=35] 的当前日期,则将保险状态更改为 Expiré =] 程序。该脚本假设在整个合同的 table 中循环并获取与我们在脚本中使用的条件相对应的行。但是,它正在更改整个 table 的状态,包括不应受强加条件影响的行。 这是 jobs.py 文件,如果条件为真,它正在安排将保险状态更改为 Expiré 的任务。

from assurance_auto.models import Contrat
from datetime import datetime, timedelta,date
from django.conf import settings

def status_schedule(): 
    
    contractList = Contrat.objects.all()
    for contrat in contractList:
        if contrat.get_NbDays()<=date.today() and contrat.statut_assurance=='Encours':
            contractList.update(statut_assurance='Expiré')
            print('Numéro de contrat est :',contrat.numero_de_contrat,\
                ' et le statut est: ',contrat.statut_assurance)
        else:
            break

下面是 updater.py 文件。这个函数是关于调度job的执行时间

from datetime import datetime
from apscheduler.schedulers.background import BackgroundScheduler
from .jobs import status_schedule
def start():
    scheduler = BackgroundScheduler()
    scheduler.add_job(status_schedule, 'interval', seconds=5)
    scheduler.start()

在 apps.py 文件中,我有下面的程序,一旦程序 运行ning 就包含 运行ning 更新程序文件。

from django.apps import AppConfig
class AssuranceAutoConfig(AppConfig):
    name = 'assurance_auto'
    def ready(self):
        from jobs import updater
        updater.start()

带圆圈的两行应该将状态更改为 Expiré。但是,所有行都将状态更改为 Expiré 这不是我想要得到的结果。 请问如何解决这个编程错误?

你不应该更新 contractList,因为那是一个包含 all 条记录的查询集,你更新那个项目:

def status_schedule(): 
    for contrat in Contrat.objects.filter(statut_assurance='Encours'):
        if contrat.get_NbDays() <= date.today():
            contrat<strong>.statut_assurance = 'Expiré'</strong>
            contrat<strong>.save()</strong>
            print('Numéro de contrat est :',contrat.numero_de_contrat,\
                ' et le statut est: ',contrat.statut_assurance)

您还应该 break 循环。

根据 get_NbDays 的实现,您还可以将其移至 .filter(…) 子句,在这种情况下使用 .update(…)

contractList = Contrat.objects.all()
for contrat in contractList:
    if contrat.NbDays<=date.today() and contrat.statut_assurance=='Encours':
        Contrat.objects.filter(id=contract.id).update(statut_assurance='Expiré')
        print('Numéro de contrat est :',contrat.numero_de_contrat,\
            ' et le statut est: ',contrat.statut_assurance)