Как создать общие отношения с наследованием? - PullRequest
0 голосов
/ 23 декабря 2019

У меня есть примерно такая структура: кампания может содержать несколько действий. Каждое действие должно быть связано с кампанией. Существует другой тип действия, такой как электронная почта, веб-перехват и т. Д. Общей точкой этих действий является метод «выполнения». Когда я запускаю метод запуска кампании, также должны запускаться действия, связанные с кампанией.

Я думаю, что-то вроде этого будет работать для меня:

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: «Вот продукты, которые могут вас заинтересовать»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...