保存查询集的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,如果不清楚的话,您可能需要阅读教程,直到找到为止。你会看到它到处都是。