Периодическая задача сельдерея с функцией просмотра

Я создал периодические задачи для отправки писем только один раз в заданное время, как показано ниже, используя сигналы сохранения почты

class MailTask(models.Model):
    name = models.CharField(max_length=100, blank=True)
    subject = models.CharField(max_length=100)
    message = models.TextField()
    from_email = models.EmailField()
    recipient = models.EmailField()
    sent = models.BooleanField(default=False)
    time_to_send = models.DateTimeField()

def create_periodic_task(sender, instance, created, **kwargs):
    if created:
        time_to_send = instance.time_to_send
        clocked_schedule, created = ClockedSchedule.objects.get_or_create(
            clocked_time=time_to_send
        )
        periodic_task = PeriodicTask.objects.create(
            clocked=clocked_schedule,
            name=instance.name,
            task='core.tasks.send_mail_func',
            one_off=True,
        )


post_save.connect(create_periodic_task, sender=MailTask)

функция, которую нужно вызвать, выглядит следующим образом

@shared_task
def send_mail_func():
    mail_task = MailTask.objects.last()
    send_mail(
        mail_task.subject,
        mail_task.message,
        mail_task.from_email,
        [mail_task.recipient],
        fail_silently=False,
    )

Это запустит только последний экземпляр почтовой задачи, как я могу перебрать все экземпляры и отправить почту, или как я могу подключить периодическую задачу id соответствующую почтовую функцию

Чтобы вызвать эту функцию, вы можете написать код в любой функции, например :

mail_tasks = MailTask.objects.all()
for obj in mail_tasks:
    subject = obj.subject
    body = obj.msg
     ...
    data = {'subject': subject, "msg":body, ...}

    send_mail_func.delay(data)

Теперь просто обновите вашу функцию send_mail_func, которая принимает аргумент.

Вернуться на верх