如果有公司的模型。这些公司具有属性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")
,但这会返回一个奇怪的activatorquery集。有没有办法返回正常的查询集?或者values()
已经是正确的方法了吗?
编辑:再详细说明:我希望最终得到一个包含所有UserWorkerprofile模型实例的查询集。
在values()
的文档中,它说:
返回一个QuerySet,当用作可迭代时,它返回字典而不是模型实例。
我想要一个模型实例的查询集。
答案 0 :(得分:2)
根据您的评论,您希望所有 UserWorkerProfile
a (可能有零个,一个或多个)相关Employment
实例Employment
实例的Company
(每Employment
个完全一个company
),给定的公司。
我们可以使用以下查询查询此类UserWorkingProfile
:
UserWorkingProfile.objects.filter(employment__company=some_comany)
因此,此查询集将返回所有 UserWorkingProfile
,其中存在Employment
实例,该实例链接到给定公司some_company
和{{1} }。
在Django中,使用两个连续的下划线来查看“通过”关系(这可以在双向中使用,请注意两个连续的下划线用于其他事情,而不是查看关系)。
我们编写了一个看起来像或多或少的查询:
UserWorkingProfile
实际上SELECT `userworkingprofile`.*
FROM `userworkingprofile`
JOIN `employment` ON `employment`.`employee_id` = `userworkingprofile`.`id`
WHERE `employment`.`company_id` = 123
123
pk
。{/ p>
请注意,如果员工已多次为some_company
工作,则此查询集中的相同 UserWorkingProfile
可能会出现多次次
如果您希望每个some_company
最多一次,则应向其添加UserWorkingProfile
:
.distinct()
虽然Django确实在UserWorkingProfile.objects.filter(employment__company=some_comany).distinct()
个实例上定义了一个名为employment_set
的对象管理器,据我所知,你不能“合并”两个这样的管理器(所以Company
会不工作)。