У меня есть примерно такая структура: кампания может содержать несколько действий. Каждое действие должно быть связано с кампанией. Существует другой тип действия, такой как электронная почта, веб-перехват и т. Д. Общей точкой этих действий является метод «выполнения». Когда я запускаю метод запуска кампании, также должны запускаться действия, связанные с кампанией.
Я думаю, что-то вроде этого будет работать для меня:
class Campaign(models.Model):
name = models.CharField(max_length=32)
description = models.CharField(max_length=255)
is_active = models.BooleanField(default=False)
def run(self, data):
for action in self.actions.all():
action.run(data)
class Action(models.Model):
name = models.CharField(max_length=32)
campaign = models.ForeignKey(
Campaign,
on_delete=models.CASCADE,
related_name='actions',
)
class Meta:
abstract = True
def run(self, data):
print(f'The {self.name} action ran.')
print(f'Data: {data}')
class EmailAction(Action):
subject = models.CharField(max_length=128)
body = models.TextField()
class Meta:
db_table = 'email_action'
def run(self, data):
super(EmailAction, self).run(data)
class WebhookAction(Action):
url = models.CharField(max_length=256)
body = models.TextField()
class Meta:
db_table = 'webhook_action'
def run(self, data):
super(WebhookAction, self).run(data)
Каков наилучший способ добиться этогорабочий процесс?
Сценарий: Я создам кампанию. Например, уведомление о добавлении в корзину (название кампании). Затем я создам EmailAction и сообщу: «Вы добавили товар в корзину». Если однажды мне нужно будет передать это событие во внешнюю службу, я создам действие веб-хука. Может быть, я могу еще один EmailAction: «Вот продукты, которые могут вас заинтересовать»