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")
, это разрушает мое представление управления кампанией, и единственный способ, который я нашел, чтобы исправить это - отменить миграцию, удалить базу данных и загрузить данные заново.
Мне нужно иметь возможность назначить отношения сотрудников нескольким полям в кампании, чтобы я мог отслеживать менеджеров, которые завершили свои обзоры в самой системе. Я уже создаю файлы для каждого завершенного обзора, чтобы использовать их для изменений и регистрации, но я не могу разобраться с этой частью.
Любая помощь или направление в этом вопросе будут признательны.