当前位置: 首页 > 知识库问答 >
问题:

给定一个对象查询集,对于每一个对象,我如何找到为该对象设置外键的所有对象集?

羊渝
2023-03-14

我有:

class Teacher(models.Model):
    name = models.CharField(...)
    ...

class Student(models.Model):
    age = models.IntegerField(...)
    teacher = models.ForeignKey(Teacher, ...)
    ...

我有一组老师:

teachers = Teacher.objects.filter(name="Betty")

我想找到与该查询集中每个教师相关的所有学生,我需要将结果按教师分组。比如:

{
    <Teacher: 1>: [<Student: 1>, <Student: 2>],
    <Teacher: 2>: [<Student: 3>, <Student: 4>]
}

我可以通过在teachersqueryset中的每个对象上循环,并根据外传给该教师的学生筛选学生来实现这一点,但这似乎非常缓慢,需要对每个对象进行额外的DB调用。在理想情况下,在只使用Python而不使用SQL的情况下,是否有任何方法可以通过一个或几个DB调用来实现这一点?

共有1个答案

董品
2023-03-14

我很确定这就是选择相关和预取相关的全部要点。以下是有关选择相关的说明:

返回一个查询集,该查询集将“遵循”外键关系,在执行查询时选择其他相关对象数据。这是一个性能提升器,它会导致单个更复杂的查询,但意味着以后使用外键关系将不需要数据库查询。

所以你可以这样做:

teachers = Teacher.objects.filter(name="betty").prefetch_related("student_set")  # student_set OR whatever is in your related_name field

 类似资料:
  • 假设我有以下内容 这会产生如下所示的数组 我可以做一个级别,但是多个杠杆怎么样?我的伪代码类似于 但是对于无限的势能级,我该怎么做呢?

  • 问题内容: 假设我有2张桌子,分别称为父母和孩子。父母可以有零个到多个孩子,而一个孩子可以有1个到很多父母。如何找到作为两个特定孩子的父母的所有父母元素。 例如,假设我有父母[p_a,p_b,p_c,p_d]和孩子:[c_a,c_b]他们的结构如下: p_a的孩子为c_a p_b将c_b作为孩子 p_c将c_a和c_b都作为子代 p_d没有孩子 如何制定查询以选择p_c? 如果它们的结构中p具有[

  • 问题内容: 在我目前正在从事的一个项目中,我遇到了一个角度异常: 在寻找解决方案的搜索中,我直接在浏览器中输入了Web服务的URL,但令人惊讶的是,我没有收到预期的数组。 Web服务类: 当我输入网址时,我希望看到带有JSON对象的JSON数组: 但是,相反,我收到的JSON对象的属性与我期望的JSON对象相同,没有任何数组: 所以我想知道为什么没有数组,当我添加另一个Clazz对象时会发生什么。

  • 问题内容: 在Python中,是否有一个库方法可在同一类的两个(已经存在)实例之间复制所有属性? 我的意思是,类似Apache Commons的东西 问题答案: 如果您的班级未修改或出于特殊属性访问目的,则所有属性都存储在其中,因此您可以执行以下操作: 如果使用python属性,则应查看并筛选出要复制的属性。

  • 给定以下JSON结构,我希望能够在数组,其中包含具有特定。 假设我正在寻找带有的条目——在这种情况下,我想提取完整的对象: 我尝试嵌套过滤器,但没有成功: 我可以很容易地通过,但是我想实际上检索它的父对象!这在JSONPath中可能吗?

  • 本文向大家介绍PowerShell 每个对象,包括了PowerShell 每个对象的使用技巧和注意事项,需要的朋友参考一下 示例 该ForEach-Objectcmdlet的工作原理类似于该foreach语句,但从管道中获取其输入。 基本用法 例: Foreach-Object有两个默认别名,foreach和%(简写语法)。最常见的是%因为foreach可以与foreach语句混淆。例子: 高级用