Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保存查询集的Python/Django递归问题_Django_Postgresql_Python 3.x_Recursion_Django Models - Fatal编程技术网

保存查询集的Python/Django递归问题

保存查询集的Python/Django递归问题,django,postgresql,python-3.x,recursion,django-models,Django,Postgresql,Python 3.x,Recursion,Django Models,我有用户配置文件,每个配置文件都分配了一个管理员。我认为使用递归将是一种很好的方法,可以查询特定经理下各级的每个员工。目标是,如果首席执行官要登录,他应该能够询问公司的每个人——但如果我登录,我只能看到我的直接团队中的人和他们下面的人,等等,直到你找到低级别的员工 但是,当我运行以下命令时: def team_training_list(request): # pulls all training documents from training document model user = r

我有用户配置文件,每个配置文件都分配了一个管理员。我认为使用递归将是一种很好的方法,可以查询特定经理下各级的每个员工。目标是,如果首席执行官要登录,他应该能够询问公司的每个人——但如果我登录,我只能看到我的直接团队中的人和他们下面的人,等等,直到你找到低级别的员工

但是,当我运行以下命令时:

def team_training_list(request):
 # pulls all training documents from training document model
 user = request.user
 manager_direct_team = Profile.objects.filter(manager=user)
 query = Profile.objects.filter(first_name='fake')
 trickle_team = manager_loop(manager_direct_team, query)
 # manager_trickle_team = manager_direct_team | trickle_team
 print(trickle_team)

def manager_loop(list, query):
 for member in list:
    user_instance = User.objects.get(username=member)
    has_team = Profile.objects.filter(manager=user_instance)
    if has_team:
        query = query | has_team
        manager_loop(has_team, query)

    else:
        continue

 return query
它只返回运行的最后一个查询,而不是我试图增长的已编译查询集。我尝试将“return”放在“manager\u”循环(has\u team,query)之前以保存值,但它也会在第一个非manager员工处终止循环,而不是继续到下一个员工

我是django的新手,所以如果有比递归更好的方法来获取我需要的信息,我也非常感谢您的建议

编辑: 根据要求,以下是配置文件模型

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=30, blank=False)
    last_name = models.CharField(max_length=30, blank=False)
    email = models.EmailField( blank=True, help_text='Optional',)
    receive_email_notifications = models.BooleanField(default=False)
    mobile_number = models.CharField(
        max_length=15,
        blank=True,
        help_text='Optional'
    )
    carrier_options = (
        (None, ''),
        ('@txt.att.net', 'AT&T'),
        ('@messaging.sprintpcs.com', 'Sprint'),
        ('@tmomail.net', 'T-Mobile'),
        ('@vtext.com', 'Verizon'),
    )
    mobile_carrier = models.CharField(max_length=25, choices=carrier_options, blank=True,
                                      help_text='Optional')

    receive_sms_notifications = models.BooleanField(default=False)
    job_title = models.ForeignKey(JobTitle, unique=False, null=True)
    manager = models.ForeignKey(User, unique=False, blank=True, related_name='+', null=True)

好的,这是一个层次模型

您当前的方法存在以下问题:

query = query | has_team
这会将本地名称
query
重新分配给新的queryset,但不会在调用者中重新分配名称。(好吧,我想这就是它想要做的——我有点生疏了,但我不认为你可以像那样把
|
查询集放在一起。)你还需要这样的东西:

query = manager_loop(has_team, query)
通过返回的对象传播更改

这就是说,虽然Django没有对递归查询的内置支持,但也有一些第三方软件包支持递归查询。旧答案如(和)推荐django mptt。你的标签提到了postgres,所以这篇文章可能是相关的:


如果不使用第三方方法,应该可以清理queryset的演变-将其转换为集合并使用
update
或其他方法,因为您正在积累配置文件。但是关键错误是没有使用返回的修改对象。

好的,所以它是一个层次模型

您当前的方法存在以下问题:

query = query | has_team
这会将本地名称
query
重新分配给新的queryset,但不会在调用者中重新分配名称。(好吧,我想这就是它想要做的——我有点生疏了,但我不认为你可以像那样把
|
查询集放在一起。)你还需要这样的东西:

query = manager_loop(has_team, query)
通过返回的对象传播更改

这就是说,虽然Django没有对递归查询的内置支持,但也有一些第三方软件包支持递归查询。旧答案如(和)推荐django mptt。你的标签提到了postgres,所以这篇文章可能是相关的:


如果不使用第三方方法,应该可以清理queryset的演变-将其转换为集合并使用
update
或其他方法,因为您正在积累配置文件。但是关键的错误是没有使用返回的修改对象。

几乎可以肯定有一种更简单的方法可以做到这一点。如果你展示你的模型,人们可能会帮助你起草一个更简单的查询。几乎可以肯定,有一种更简单的方法可以做到这一点。如果你展示你的模型,人们可能会帮助你起草一个更简单的查询。嗨,彼得,我把If语句的最后一行修改为“query=manager\u loop(has\u team,query)”,它成功了!但是我在理解将queryset赋值为函数本身的逻辑时遇到了困难。你不是将queryset赋值给函数,而是将queryset赋值给函数的返回值。对于返回新值的函数来说,这是非常标准的Python,如果不清楚的话,您可能需要阅读教程,直到找到为止。你会看到它到处都是。嗨,彼得,我把IF语句的最后一行修改为“query=manager\u loop(has\u team,query)”,它成功了!但是我在理解将queryset赋值为函数本身的逻辑时遇到了困难。你不是将queryset赋值给函数,而是将queryset赋值给函数的返回值。对于返回新值的函数来说,这是非常标准的Python,如果不清楚的话,您可能需要阅读教程,直到找到为止。你会看到它到处都是。