Django 1.11 querysets:获取关系集

时间:2018-06-11 20:52:46

标签: django django-models django-queryset django-orm django-1.11

如果有公司的模型。这些公司具有属性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,当用作可迭代时,它返回字典而不是模型实例。

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

1 个答案:

答案 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工作)。