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
) , 给定的公司。
我们可以使用以下查询查询这样的 UserWorkingProfile
s:
UserWorkingProfile.objects.filter(<b>employment__company=some_comany</b>)
因此此查询集将 return 所有 UserWorkingProfile
s 存在链接到给定公司的 Employment
实例 some_company
和 UserWorkingProfile
.
在 Django 中,使用两个连续的下划线来查找 "through" 关系(这可以在 中双向使用 ,请注意,两个连续的下划线用于其他用途,而不是看关系)。
因此,我们编写了一个查询,大致类似于:
SELECT `userworkingprofile`.*
FROM `userworkingprofile`
JOIN `employment` ON `employment`.`employee_id` = `userworkingprofile`.`id`
WHERE `employment`.`company_id` = 123
和123
现实中some_company
的pk
。
请注意,如果员工已经工作,same UserWorkingProfile
可能在此查询集中出现 multiple 次some_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>
将 不 起作用。
如果有公司模型。这些公司有一个属性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
) , 给定的公司。
我们可以使用以下查询查询这样的 UserWorkingProfile
s:
UserWorkingProfile.objects.filter(<b>employment__company=some_comany</b>)
因此此查询集将 return 所有 UserWorkingProfile
s 存在链接到给定公司的 Employment
实例 some_company
和 UserWorkingProfile
.
在 Django 中,使用两个连续的下划线来查找 "through" 关系(这可以在 中双向使用 ,请注意,两个连续的下划线用于其他用途,而不是看关系)。
因此,我们编写了一个查询,大致类似于:
SELECT `userworkingprofile`.*
FROM `userworkingprofile`
JOIN `employment` ON `employment`.`employee_id` = `userworkingprofile`.`id`
WHERE `employment`.`company_id` = 123
和123
现实中some_company
的pk
。
请注意,如果员工已经工作,same UserWorkingProfile
可能在此查询集中出现 multiple 次some_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>
将 不 起作用。