保存的查询集

时间:2017-07-06 18:05:44

标签: django postgresql python-3.x recursion django-models

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

但是当我运行以下内容时:

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)

1 个答案:

答案 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 childsCreating 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) 或其他内容,因为您可以使用重新累积配置文件。但是关键错误是没有使用返回的修改对象。