我有用户配置文件,每个配置文件都分配了一个管理器。我认为使用递归将是查询特定经理下每个级别的每个员工的好方法。目标是,如果首席执行官要登录,他应该能够查询公司的每个人 - 但如果我签字,我只能看到我的直接团队中的人和他们下面的人等等,直到你到达低级别员工。
但是当我运行以下内容时:
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_loop(has_team,查询)按顺序保存值,但它也会杀死第一个非经理员工的循环,而不是继续下一个员工。
我是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)
答案 0 :(得分:2)
好的,所以它是一个分层模型。
您当前的方法存在的问题是这一行:
class Shipment
def latest_note_with_status
notes.latest.with_status.first
end
end
这会将本地名称query = query | has_team
重新分配给新的查询集,但不会在调用方中重新分配该名称。 (嗯,这就是我认为它想做的事情 - 我有点生疏,但我认为你不能query
这样的查询集。)你&#39 ; d也需要类似的东西:
|
通过返回的对象传播更改。
尽管如此,虽然Django没有对递归查询的内置支持,但是有一些第三方软件包可以做到。旧答案例如(Django self-recursive foreignkey filter query for all childs和Creating efficient database queries for hierarchical models (django))推荐django-mptt。你的标签提到postgres,所以这篇文章可能是相关的: https://two-wrongs.com/fast-sql-for-inheritance-in-a-django-hierarchy
如果您不使用第三方方法,则应该可以清理查询集的演变 - 将其转换为集合并使用query = manager_loop(has_team, query)
或其他内容,因为您可以使用重新累积配置文件。但是关键错误是没有使用返回的修改对象。