通过使用Django-Celery-Beat设置动态任务调度来获得错误

发布于 2025-02-11 06:49:48 字数 3165 浏览 1 评论 0原文

我正在基于模型创建设置动态cron,以创建另一个模型对象

错误im获取

无法分配”(< crontabschedule:0 0 27 1 *(m/h/h/dm/my/d)utc>, true):“ ofentictask.crontab”必须是“ crontabschedule”实例。

将创建定期任务

import json
from django.utils import timezone
import uuid
from django.db import models
from django_celery_beat.models import CrontabSchedule, PeriodicTask

# Create your models here.


class Rule(models.Model):
    rule_id = models.UUIDField(
         primary_key = False,
         default = uuid.uuid4,
         editable = True)
    name = models.CharField('r=Rule Name',max_length=255,blank=True,null=True)
    compliance_frequency = models.CharField(max_length=40,choices=(('QUARTERLY','QUARTERLY'),
    ('MONTHLY','MONTHLY'),('YEARLY','YEARLY')),default='YEARLY')
    applicable_from = models.DateField(default=timezone.now)
    applicable_to = models.DateField(null=True,blank=True)
    task = models.OneToOneField(
        PeriodicTask,
        on_delete=models.CASCADE,
        null=True,
        blank=True
    )
       
    def setup_task(self):
        self.task = PeriodicTask.objects.create(
            name=self.name,
            task='create_compliance',
            crontab=self.crontab_schedule,
            args=json.dumps([self.id,self.name,self.compliance_frequency]),
            start_time= timezone.now(),
        )
        self.save()

    @property
    def crontab_schedule(self):
        if self.compliance_frequency == "QUARTERLY":
            return CrontabSchedule.objects.get_or_create(minute='0',hour='0',day_of_week='*',
            day_of_month='27',month_of_year='3,6,9,12')
        if self.compliance_frequency == "MONTHLY":
            return CrontabSchedule.objects.get_or_create(minute='0',hour='0',day_of_week='*',
            day_of_month='27',month_of_year='*')
        if self.compliance_frequency == 'YEARLY':
            return CrontabSchedule.objects.get_or_create(minute='0',hour='0',day_of_week='*',
            day_of_month='27',month_of_year='1')

        raise NotImplementedError(
            '''Interval Schedule for {interval} is not added.'''.format(
                interval=self.compliance_frequency.

这是我的代码,在其中使用signal signal.py我触发setup_task来设置任务,

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Rule


@receiver(post_save,sender=Rule)
def create_periodic_task(sender, instance, created, **kwargs):
    if created:
        instance.setup_task()
        instance.task.enabled = True
        instance.task.save()
        print('signal working')

然后使用触发任务创建模型

from __future__ import absolute_import, unicode_literals
from celery.utils.log import get_task_logger
from celery import shared_task
from pytz import timezone
from test3.models import Compliance

logger = get_task_logger(__name__)


@shared_task
def create_compliance(id,name,compliance_frequency):

    Compliance.objects.create(rule_id=id,name=name,compliance_frequency=compliance_frequency)

    id = Compliance.object.get(id=id)
    logger.info(id.id,'periodic task working bitch')

I'm setting up Dynamic cron based on the model creation to create another model object

error im getting is

Cannot assign "(<CrontabSchedule: 0 0 27 1 * (m/h/dM/MY/d) UTC>,
True)": "PeriodicTask.crontab" must be a "CrontabSchedule" instance.

this is my code where a periodic task will be created by creating this model

import json
from django.utils import timezone
import uuid
from django.db import models
from django_celery_beat.models import CrontabSchedule, PeriodicTask

# Create your models here.


class Rule(models.Model):
    rule_id = models.UUIDField(
         primary_key = False,
         default = uuid.uuid4,
         editable = True)
    name = models.CharField('r=Rule Name',max_length=255,blank=True,null=True)
    compliance_frequency = models.CharField(max_length=40,choices=(('QUARTERLY','QUARTERLY'),
    ('MONTHLY','MONTHLY'),('YEARLY','YEARLY')),default='YEARLY')
    applicable_from = models.DateField(default=timezone.now)
    applicable_to = models.DateField(null=True,blank=True)
    task = models.OneToOneField(
        PeriodicTask,
        on_delete=models.CASCADE,
        null=True,
        blank=True
    )
       
    def setup_task(self):
        self.task = PeriodicTask.objects.create(
            name=self.name,
            task='create_compliance',
            crontab=self.crontab_schedule,
            args=json.dumps([self.id,self.name,self.compliance_frequency]),
            start_time= timezone.now(),
        )
        self.save()

    @property
    def crontab_schedule(self):
        if self.compliance_frequency == "QUARTERLY":
            return CrontabSchedule.objects.get_or_create(minute='0',hour='0',day_of_week='*',
            day_of_month='27',month_of_year='3,6,9,12')
        if self.compliance_frequency == "MONTHLY":
            return CrontabSchedule.objects.get_or_create(minute='0',hour='0',day_of_week='*',
            day_of_month='27',month_of_year='*')
        if self.compliance_frequency == 'YEARLY':
            return CrontabSchedule.objects.get_or_create(minute='0',hour='0',day_of_week='*',
            day_of_month='27',month_of_year='1')

        raise NotImplementedError(
            '''Interval Schedule for {interval} is not added.'''.format(
                interval=self.compliance_frequency.

value))

now using signal.py i'm triggering the setup_task to setup the task

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Rule


@receiver(post_save,sender=Rule)
def create_periodic_task(sender, instance, created, **kwargs):
    if created:
        instance.setup_task()
        instance.task.enabled = True
        instance.task.save()
        print('signal working')

then using trigger a task to create a model

from __future__ import absolute_import, unicode_literals
from celery.utils.log import get_task_logger
from celery import shared_task
from pytz import timezone
from test3.models import Compliance

logger = get_task_logger(__name__)


@shared_task
def create_compliance(id,name,compliance_frequency):

    Compliance.objects.create(rule_id=id,name=name,compliance_frequency=compliance_frequency)

    id = Compliance.object.get(id=id)
    logger.info(id.id,'periodic task working bitch')

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文