Оптимизация рекурсивной функции в модели древовидной структуры Django
Я пытаюсь реализовать иерархию команды в рабочем приложении Django. Мои требования таковы
- Команда может иметь руководителя команды, членов и родительскую команду. текущий узел будет считаться одним из дочерних узлов родительской команды .
- Руководитель команды может получить доступ к членам команды и всем дочерним членам команды (дочерним узлам на любом уровне иерархии)
Например, у команды 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
Заранее спасибо. Пожалуйста, помогите