【问题标题】:Django 1.11 querysets: Get all objects (model instances) of a relationship setDjango 1.11 查询集:获取关系集的所有对象(模型实例)
【发布时间】:2018-11-21 04:24:08
【问题描述】:

如果有公司模型。这些公司有一个属性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"),但这会返回一个奇怪的激活器查询集。有没有办法返回正常的查询集?还是values() 已经是正确的方法?

编辑:详细说明:我想最终得到一个包含所有 UserWorkerprofile 模型实例的查询集。

values() 的文档中说:

当用作可迭代对象时,返回一个返回字典而不是模型实例的 QuerySet。

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

【问题讨论】:

  • 就像你说的那样,employment_set。这是一个经理,因此您可以例如写some_company.employment_set.all() 来获取所有Employments。这就像每个 QuerySet:你可以 .filter(..) 等。
  • @willem-van-onsem 是的,但是我有所有的就业模型实例。我进一步阐述了这个问题。我想以所有员工的查询集结束,而不是就业。
  • 啊,那是UserWorkerProfile.objects.filter(employment__company=some_company)
  • @willem-van-onsem 谢谢你,这已经很有帮助了!这是反过来的唯一方法吗?来自公司,更像我上面描述的?
  • 据我所知,你不能查询对象管理器的关系,据我所知(afaik,确实 not 存在类似some_company.employment_set.userworkerprofile_set 的东西.

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


【解决方案1】:

根据您的评论,您希望 all UserWorkerProfiles 具有 a(可以有零个、一个或多个)相关的 Employment 实例和 @987654323具有Company 的@ 实例(每个Employment恰好有一个company),一个给定的公司。

我们可以通过以下查询来查询这样的UserWorkingProfiles:

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

因此,此查询集将返回 all UserWorkingProfiles,其中存在链接到给定公司 some_companyUserWorkingProfileEmployment 实例。

在 Django 中,使用两个连续的下划线来“透视”关系(这可以在双向中使用,注意两个连续的下划线用于查看关系之外的其他事情)。

因此,我们编写了一个查询,看起来或多或少像:

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

123 实际上是 pksome_company

请注意,如果员工曾多次为some_company 工作过,相同 UserWorkingProfile 可能在此查询集中出现多次 次。

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

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

虽然 Django 确实在 Company 实例上定义了一个名为 employment_set 的对象管理器,但据我所知,您不能“合并”两个这样的管理器(所以 <s>some_company.employment_set.employee</s>工作)。

【讨论】:

  • 那我描述的不对。我希望他们至少有一个相关的就业实例:)
  • @J.Hesters:这确实是查询的作用。但由于 JOINing 的事实,如果该人在该公司工作 几次 次,则相同的 UserWorkingProfile 可能会出现多次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 2021-02-25
  • 1970-01-01
  • 2018-12-04
  • 2011-01-15
  • 1970-01-01
相关资源
最近更新 更多