在 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)
在我的程序中,我安排了一项任务,如果到期日等于我 [=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()
你不应该更新 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)