Как разработать модель для приложения Django TaskManager?

Мне нужно небольшое приложение для управления задачами, которое выполняет определенные задачи, например, копирование файла, отправка электронной почты, создание pdf и так далее. Задачи также должны выполняться в порядке/приоритете, например, первая: создать pdf, вторая: отправить почту. Сейчас я размышляю над тем, какой должна быть хорошая модель для этого. Кое-где мне не очень нравятся идеи, которые у меня есть. Среди прочего, у меня есть такие вопросы, как:

  1. Как может выглядеть модель?
  2. Нужно ли использовать абстрактный класс?
  3. Как насчет наследования? Должен ли я использовать здесь значения NULL и лучше использовать большую таблицу, а не разбивать ее на отдельные таблицы?
  4. Пример для "models.py":

    class Channel(models.Model):
        name = models.CharField(max_length=50, unique=True, null=False)
        active = models.BooleanField(default=False)
    
        @admin.display(boolean=True)
        def is_active(self):
            return self.active
    
        def __str__(self):
            return self.name
    
        class Meta:
            db_table = 'channel'
            verbose_name = 'Channel'
            verbose_name_plural = 'Channel'
    
    
    class Task(models.Model):
        name = models.CharField(max_length=50, unique=True, null=False)
        active = models.BooleanField(default=False)
        priority = models.IntegerField(null=False)
        channel = models.ForeignKey(Channel, on_delete=models.CASCADE, related_name='%(class)s_channel')
    
        @admin.display(boolean=True)
        def is_active(self):
            return self.active
    
        class Meta:
            abstract = True
    
    
    class CopyFile(Task):
        path_src = models.CharField(max_length=200, null=False)
        path_dest = models.CharField(max_length=200, null=False)
        pattern = models.CharField(max_length=200, null=False)
    
        def __str__(self):
            return self.name
    
        class Meta:
            db_table = 'task_copy_file'
            verbose_name = 'Task (CopyFile)'
            verbose_name_plural = 'Task (CopyFile)'
    
    
    class SendMail(Task):
        recipient = models.CharField(max_length=200, null=False)
        sender = models.CharField(max_length=200, null=False)
        content = models.CharField(max_length=200, null=False)
    
        def __str__(self):
            return self.name
    
        class Meta:
            db_table = 'task_send_mail'
            verbose_name = 'Task (SendMail)'
            verbose_name_plural = 'Task (SendMail)'
    
    
    class CreatePDF(Task):
        path_src = models.CharField(max_length=200, null=False)
        path_dest = models.CharField(max_length=200, null=False)
        pattern = models.CharField(max_length=200, null=False)
    
        def __str__(self):
            return self.name
    
        class Meta:
            db_table = 'task_create_pdf'
            verbose_name = 'Task (CreatePDF)'
            verbose_name_plural = 'Task (CreatePDF)'
    
    Вернуться на верх