我有一个模型,它看起来像:
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)向管理员报告,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 最终会超时。获取团队所有成员的更有效方法是什么?
最佳答案
如果您使用的数据库支持递归公用表表达式(例如 PostgreSQL),这正是用例。
team = StaffMember.objects.raw('''
WITH RECURSIVE team(id, supervisor) AS (
SELECT id, supervisor
FROM staff_member
WHERE id = 42
UNION ALL
SELECT sm.id, sm.supervisor
FROM staff_member AS sm, team AS t
WHERE sm.id = t.supervisor
)
SELECT * FROM team
''')
引用资料:
Raw SQL queries in Django
Recursive Common Table Expressions in PostgreSQL
关于python - 如何有效地在django中递归查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39511993/