【发布时间】:2017-01-23 12:46:12
【问题描述】:
我有一个模型,看起来像:
class StaffMember(models.Model):
id = models.OneToOneField(to=User, unique=True, primary_key=True, related_name='staff_member')
supervisor = models.ForeignKey(to='self', null=True, blank=True, related_name='team_members')
我当前的团队层次结构是这样设计的,假设有一个管理员(他位于层次结构的最高点)。现在,假设有 3 个人(A、B、C)向 Admin 报告,A、B 和 C 中的每一个人都有自己的团队向他们报告,依此类推。
我想为任何员工查找所有团队成员(归结为最底层的层次结构)。 我目前获取一个人的所有团队成员的方法是:
def get_team(self):
team = [self]
for c in self.team_members.all():
team += list(c.get_team())
if len(team) > 2000:
break
return team
我通过以下方式获取成员的团队成员:
member = StaffMember.objects.get(pk=72)
team = member.get_team()
但很明显,这会导致大量的数据库调用,我的 API 最终会超时。有什么方法可以更有效地获取团队的所有成员?
【问题讨论】:
-
向我们展示您的 get_team() 方法
-
已添加到Q中。
-
您是否尝试过在外键上使用 _set 方法?我从来没有在递归模型上做过,所以不知道输出可能是什么样子。您也可以尝试 .select_related() 并查看最终结果。我认为这将为您提供必要的输出,但我不确定效率如何。
-
您应该使用一种有效的方式来存储/查询这些数据,例如github.com/django-mptt/django-mptt
标签: python django recursion list-comprehension django-orm