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