gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:35:46 26 4
gpt4 key购买 nike

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

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

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

它只返回运行的最后一个查询,而不是我试图增长的已编译查询集。我试过在“manager_loop(has_team, query)”之前放置“return”以保存值,但它也会终止第一个非经理员工的循环,而不是继续下一个员工。

我是 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 重新分配给新的查询集,但不会在调用者中重新分配名称。 (好吧,这就是我认为它正在尝试做的事情 - 我有点生疏,但我认为你不能像那样将 | 组合在一起。)你还需要类似的东西:

query = manager_loop(has_team, query)

通过返回的对象传播更改。

也就是说,虽然 Django 没有对递归查询的内置支持,但有一些第三方包支持。旧答案,例如(Django self-recursive foreignkey filter query for all childsCreating efficient database queries for hierarchical models (django))推荐 django-mptt。你的标签提到了 postgres,所以这篇文章可能是相关的: https://two-wrongs.com/fast-sql-for-inheritance-in-a-django-hierarchy

如果您不使用第三方方法,应该可以清理查询集的演变 - 将其转换为一个集合并使用 update 或其他方法,因为您积累个人资料。但关键错误是没有使用返回的修改对象。

关于django - 已保存查询集的 Python/Django 递归问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44956059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com