【问题标题】:Given a queryset of objects, for each one, how can I find the set of all objects that ForeignKey to that object?给定一个对象的查询集,对于每个对象,我如何找到该对象的 ForeignKey 的所有对象的集合?
【发布时间】:2019-08-26 18:34:54
【问题描述】:

我有:

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>]
}

我可以通过循环遍历 teachers 查询集中的每个对象并按该老师的 ForeignKey 的学生过滤学生来完成此操作,但这似乎真的很慢,并且需要对每个对象进行额外的 DB 调用。有没有什么方法可以在一个或几个 DB 调用中实现这一点,理想情况下,同时保持纯 Python 而不是求助于 SQL?

【问题讨论】:

标签: python django django-models


【解决方案1】:

我很确定这是select_relatedprefetch_related 的全部要点。以下是select_related的解释:

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

所以你会做这样的事情:

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

【讨论】:

    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2011-10-05
    • 2021-01-14
    • 1970-01-01
    • 2019-01-18
    • 2016-12-04
    相关资源
    最近更新 更多