ManytoManyField или Foreign Key, что использовать и как это сделать -Django User review system

Итак, я занимаюсь разработкой программы проверки доступа пользователей, в рамках которой менеджеры могут авторизоваться в системе и получить список своих непосредственных подчиненных на веб-странице, а затем могут одобрить/отказать в доступе своим сотрудникам. Мы хотим периодически запускать эти кампании по проверке в течение года, чтобы оставаться в соответствии с нашими стандартами. У меня возникли некоторые проблемы при попытке создать модель для кампании. Я включил модель сотрудника здесь для справки, по сути, я загружаю всех сотрудников в базу данных, а затем использую команду управления для создания отношений сотрудник/руководитель.

class employee(models.Model):
    pid = models.CharField(max_length=20)
    firstName = models.CharField(max_length=200)
    middleInit = models.CharField(max_length=20, null=True)
    lastName = models.CharField(max_length=200)
    title = models.CharField(max_length=200)
    email = models.CharField(max_length=200)
    managerId = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, related_name='employees')
    managerEmail = models.CharField(max_length=200, null=True)
    enabledAD = models.CharField(max_length=20, null=True)
    acsPerms = models.CharField(max_length=200, null=True)
    enabledACS = models.CharField(max_length=20, null=True)
    accessCorrect = models.BooleanField(default=False)

    def __str__(self):
        return (self.firstName + " " + self.lastName + " (" + self.pid +")")

    @classmethod
    def createEmp(cls, **kwargs):
        employee = cls.objects.get_or_create(
            managerEmail = kwargs['ManagerEmailAddress'],
            pid = kwargs['SamAccountName'],
            firstName = kwargs['GivenName'],
            middleInit = kwargs['Name'],
            lastName = kwargs['Surname'],
            title = kwargs['title'],
            email = kwargs['UserPrincipalName'],
            enabledAD = kwargs['Enabled'],
        )

Основная проблема, с которой я сталкиваюсь, заключается в получении отношений сотрудников в кампании. Вот что я думал попробовать:

class Campaign(models.Model):
    # This will be all managers currently assigned a review (both complete and incomplete)
    reviewers = models.ForeignKey('employee', null=True, blank=True, on_delete=models.CASCADE, related_name='allReviewers')
    # These are the managers who have completed their reviews
    complete = models.ForeignKey('employee', null=True, blank=True, on_delete=models.CASCADE, related_name='allCompleted')
    # These are the managers who still need to complete their reviews
    incomplete = models.ForeignKey('employee', null=True, blank=True, on_delete=models.CASCADE, related_name='allIncomplete')
    # This is the total # of users whose access is being reviewed (Everyone under 'reviewers')
    accounts = models.ForeignKey('employee', null=True, blank=True, on_delete=models.CASCADE, related_name='userReviews')
    # These are all users whose access is still awaiting review
    incomplete_accounts = models.ForeignKey('employee', null=True, blank=True, on_delete=models.CASCADE, related_name='to_be_reviewed')
    # These are all the users whose access has been marked as incorrect, or denied
    denied_accounts = models.ForeignKey('employee', null=True, blank=True, on_delete=models.CASCADE, related_name='denied')
    # These are the users whose access has been verified as correct, or approved
    approved_accounts = models.ForeignKey('employee', null=True, blank=True, on_delete=models.CASCADE, related_name='approved')

    # Date that the review started
    dateStarted = models.DateField(null=True)

    # Date that the review is expected to end
    expectedEndDate = models.DateField(null=True)

    # Actual date that the campaign is closed
    actualEndDate = models.DateField(null=True)

    # Is the review complete?
    reviewComplete = models.BooleanField(default=False)


    def __str__(self):
        return (str(self.id) + " " + str(self.expectedEndDate))

    @classmethod
    def createCampaign(cls, **kwargs):
        Campaign = cls.objects.get_or_create(
            dateStarted = datetime.now().date(),
            expectedEndDate = kwargs["expectedEndDate"],
        )

По сути, я хочу вести подсчет всех рецензентов, всех тех, кто завершил свой обзор для кампании, и всех тех, кто не завершил. Затем я хочу подсчитать сотрудников под этими менеджерами (общее количество, одобренный доступ, отказ в доступе)

Изначально я думал просто использовать функциональность внешнего ключа, но понял, что делаю это неправильно. Теперь я считаю, что мне нужно использовать manytomanyfield от Django, но когда я пытаюсь изменить модель на что-то вроде reviewers=models.ManytoManyField('employee', blank=True, related_name="allReviewers"), это разрушает мое представление управления кампанией, и единственный способ, который я нашел, чтобы исправить это - отменить миграцию, удалить базу данных и загрузить данные заново.

Мне нужно иметь возможность назначить отношения сотрудников нескольким полям в кампании, чтобы я мог отслеживать менеджеров, которые завершили свои обзоры в самой системе. Я уже создаю файлы для каждого завершенного обзора, чтобы использовать их для изменений и регистрации, но я не могу разобраться с этой частью.

Любая помощь или направление в этом вопросе будут признательны.

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