简化跨多个对象的查询

时间:2018-08-10 12:46:27

标签: django django-queryset

我正在尝试根据请求用户管理哪些部门来过滤人工查询。

安藤(例如人类)管理三个部门。我想归还这三个部门的所有人。

人类可以有多个合同。每个合同都将人员附加到部门:

class Contract(models.Model):
human = models.ForeignKey(Human, related_name='contracts', on_delete=models.CASCADE)
department = models.ForeignKey(ShowDepartment, related_name='contracts', on_delete=models.CASCADE)

我在下面的内容有用,但是我敢肯定有一种更有效的方法来进行此查询。

output_humans = []
depts = self.request.user.human_profile.departments_managed()
for d in depts:
    contracts = Contract.objects.filter(department=d)
    for c in contracts:
        if c.human not in output_humans:
            output_humans.append(c.human)

1 个答案:

答案 0 :(得分:0)

您可以使用双下划线(__)来通过引用(例如ForeignKey)。

y9ou对Human感兴趣,因此我们可以通过以下方式进行查询:

output_humans = Human.objects.filter(contracts__department__in=depts).distinct()

因此,我们可以省略循环(在deptscontracts上)以及Contract查询。

因此,我们要求distinct()(因为多次不返回 same Human)为此,Contract中至少有一个{ Department中的{1}}。