python - 如何有效地在django中递归查询?

标签 python django recursion list-comprehension django-orm

我有一个模型,它看起来像:

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/

相关文章:

python - 如何创建可变变量?

python - 在 android/python 中使用 opencv 处理视频的问题

django - 如何在 Django Formwizard 1.4 中动态重复步骤?

java - 为什么我的随机迷宫生成算法会在迷宫底部创建一个列模式?

python - 如何在 Python 后台运行长时间运行的作业

python - 如何在训练和测试阶段使用不同的损失函数

Django-Userena : Overriding profile editing form

python - django 中最终用户的动态表单

javascript - JavaScript 中的函数式递归方法?不良做法?

c - 获取序列的递归函数无法正常工作