Планирование изменения сатурации с помощью celery в django

В своей программе я запланировал задачу, цель которой - изменить статус страхования на Expiré, если срок исполнения равен текущей дате, когда я запускаю программу. Сценарий предполагает выполнение цикла по всей таблице Договора и выборку строк, соответствующих условию, которое мы использовали в сценарии. Однако при этом изменяется состояние всей таблицы, включая строки, которые не должны быть затронуты наложенным условием. Вот файл 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. Эта функция предназначена для планирования времени выполнения задания

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 у меня есть программа ниже, которая состоит из запуска файла обновления после запуска программы.

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

Screenshot of the occurring error Две обведенные строки - это те, которые должны изменить статус на Expiré. Однако все строки изменяют статус на Expiré, что не является тем, что я хочу получить в результате. Как я могу решить эту ошибку программирования, пожалуйста?

Вы не должны обновлять contractList, поскольку это кверисет с всеми записями, вы обновляете этот элемент с помощью:

def status_schedule(): 
    for contrat in Contrat.objects.filter(statut_assurance='Encours'):
        if contrat.get_NbDays() <= date.today():
            contrat.statut_assurance = 'Expiré'
            contrat.save()
            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)
Вернуться на верх