Django 1.11 querysets:获取关系集的所有对象(模型实例)

Django 1.11 querysets: Get all objects (model instances) of a relationship set

如果有公司模型。这些公司有一个属性employment_set,因为工人是通过雇佣关系分配给公司的。如何查询给定公司的所有员工? 雇员的模型如下所示:

class Employment(
    SoftDeletableModel,
    TimeStampedModel,
    models.Model
):
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    employee = models.ForeignKey(UserWorkerProfile)
    employed_by = models.ForeignKey(UserOwnerProfile)

我尝试使用 company.employment_set.values("employee"),但是这个 return 是一个奇怪的激活器查询集。有没有办法 return 普通查询集?或者 values() 已经是正确的方法了吗?

编辑:详细说明一下:我想以包含所有 UserWorkerprofile 模型实例的查询集结束。

values() 的文档中说:

Returns a QuerySet that returns dictionaries, rather than model instances, when used as an iterable.

我想要一个模型实例的查询集。

根据您的评论,您希望 所有 UserWorkerProfile 具有 a(可以是零个、一个或更多)相关的 Employment 实例 一个 Employment 实例具有 Company(每个 Employment 正好 一个 company) , 给定的公司。

我们可以使用以下查询查询这样的 UserWorkingProfiles:

UserWorkingProfile.objects.filter(<b>employment__company=some_comany</b>)

因此此查询集将 return 所有 UserWorkingProfiles 存在链接到给定公司的 Employment 实例 some_companyUserWorkingProfile.

在 Django 中,使用两个连续的下划线来查找 "through" 关系(这可以在 中双向使用 ,请注意,两个连续的下划线用于其他用途,而不是看关系)。

因此,我们编写了一个查询,大致类似于:

SELECT `userworkingprofile`.*
FROM `userworkingprofile`
JOIN `employment` ON `employment`.`employee_id` = `userworkingprofile`.`id`
WHERE `employment`.`company_id` = 123

123现实中some_companypk

请注意,如果员工已经工作,same UserWorkingProfile 可能在此查询集中出现 multiplesome_company.

几次

如果您希望每个 UserWorkingProfile 最多出现一次 一次,您应该向其添加 .distinct():

UserWorkingProfile.objects.filter(employment__company=some_comany)<b>.distinct()</b>

虽然 Django 确实在 Company 实例上定义了一个名为 employment_set 的对象管理器,但据我所知你不能 "combine" 两个这样的管理器(所以 <s>some_company.employment_set.employee</s> 起作用。