如何从 django 中的当前查询集中获取外键查询集

问题描述 投票:0回答:3

我有两个模型,Employee 和 Manager。 Employee 模型有一个指向 Manager 的外键。

class Manager(models.Model):

    name = models.TextField()


class Employee(models.Model):

    name = models.TextField()

    manager = models.ForeignKey(
        Manager, on_delete=models.CASCADE, related_name="manager"
    )

给定 Employee 对象的任意查询集 qs,我想获得他们的经理的查询集。这看起来很简单,但我找不到办法。在 naive python 中,我可以通过执行以下操作来获取这些管理器的列表:

qs = Employee.objects.filter(whatever)
managerlist = []
for emp in qs:
    managerlist.append(emp.manager)

这会给我一个与我的查询集中的员工相对应的经理列表。但是我想要一个查询集而不是列表。有没有快速简单的方法来做到这一点?

python django django-models django-queryset
3个回答
0
投票

首先,

related_name
应该是
related_name="employees"
related_name="employee_set"
或任何对您有意义的东西,记住“related_name 是用于从相关对象返回到当前对象的关系的名称” .

现在,如果你真的想要

queryset
的经理,你可以简单地过滤你在之前的查询中找到的经理,例如:

employee_qs = Employee.objects.filter(...)
manager_ids = set(emp.manager_id for emp in employee_qs)
manager_qs =  Manager.objects.filter(id__in=manager_ids)

注意创建

manager_ids
集,使用
manager_id
而不是
manager
,这是因为我们只需要经理的ID。


0
投票

你可以试试这个(只是一个例子):

Manager.objects.filter(employee__in=qs).values('id', 'name').distinct()

它会给你一个不同的

Manager
对象的查询集,这些对象在 qs 查询集中至少有一个相关的
Employee
对象,只包含
id
name
字段。


0
投票
manager_ids = qs.filter(manager_id__isnull=False).values_list('manager_id', flat=True)
Manager.objects.filter(id__in=manager_ids)

这应该为任何员工查询集提供一个干净的经理查询集

© www.soinside.com 2019 - 2024. All rights reserved.