Оптимизация рекурсивной функции в модели древовидной структуры Django

Я пытаюсь реализовать иерархию команды в рабочем приложении Django. Мои требования таковы

  1. Команда может иметь руководителя команды, членов и родительскую команду. текущий узел будет считаться одним из дочерних узлов родительской команды
  2. .
  3. Руководитель команды может получить доступ к членам команды и всем дочерним членам команды (дочерним узлам на любом уровне иерархии)

Например, у команды A есть дочерняя команда Team A1 и команда Team A2, а у команды A2 есть еще одна дочерняя команда TEAM A21, Руководитель команды A может получить доступ ко всем данным членов команды A, команды A1, команды A2 и команды A21

Посмотрите, пожалуйста, структуру моей модели

class Team(models.Model):
    title=models.CharField(max_length=200,null=True)  
    team_lead=models.ForeignKey(StaffUser,on_delete=models.SET_NULL,related_name='teams_leaded',null=True)
    member_staffs=models.ManyToManyField(StaffUser,related_name='teams_joined')    
    parent=models.ForeignKey("self", on_delete=models.SET_NULL,blank=True, null=True,related_name='children')
    published_date = models.DateTimeField(blank=True, null=True)
   
class StaffUser(models.Model):
    name=models.CharField(max_length=100,null=True)   
    email=models.CharField(max_length=100,null=True)
    user=models.OneToOneField(User, on_delete=models.CASCADE,related_name='staffs',null=True)

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

def extractMembers(staff_obj,sub_members):
    try:
        if(staff_obj.user.id not in sub_members):
            sub_members.append(staff_obj.user.id)
            if(staff_obj.teams_leaded is not None):
                leaded_teams=staff_obj.teams_leaded.all()
                for team_obj in leaded_teams:
                    team_members=team_obj.member_staffs.all()                    
                    for tmember_obj in team_members:                        
                        if(tmember_obj.user.id not in sub_members):
                            sub_members.append(tmember_obj.user.id)
                    child_teams=team_obj.children.all()         
                    for team_child_obj in child_teams:
                        child_team_staffs=team_child_obj.member_staffs.all()
                        for member_obj in child_team_staffs:
                            sub_members=extractMembers(member_obj,sub_members)
    except Exception as e:
        print(str(e))
 
    return sub_members    

Заранее спасибо. Пожалуйста, помогите

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