Python 如何在一个查询中检索3个不同表中的所有数据?

Python 如何在一个查询中检索3个不同表中的所有数据?,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,我想做以下工作,但我不明白我将如何做: 给我看每个班级的所有学生,给我看这个班级的每个学生的所有统计数据 我的模型是: class Classes(models.Model): name = models.CharField(max_length=256) day_and_time= models.CharField(max_length=256) def __str__(self): return self.name def get_abso

我想做以下工作,但我不明白我将如何做:

给我看每个班级的所有学生,给我看这个班级的每个学生的所有统计数据

我的模型是:

class Classes(models.Model):
    name = models.CharField(max_length=256)
    day_and_time= models.CharField(max_length=256)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("classesapp:class_detail", kwargs={"pk": self.pk})


class Students(models.Model):
    name = models.CharField(max_length=256)
    student_class =  models.ForeignKey(
        Classes, related_name = 'students', on_delete=models.SET_NULL, null=True
    )

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("classesapp:student_detail", kwargs={"pk": self.pk})

class Statistics(models.Model):
    student= models.ForeignKey(
        Students, related_name='statistics', on_delete=models.CASCADE, null=True
    )
    date = models.DateField(blank=True, null=True)
    dictation_score = models.FloatField()
    writing_score = models.FloatField()
    test_score = models.FloatField()
    grammar_score = models.FloatField()
    in_class_performance = models.FloatField()

    class Meta:
        ordering = ["-date"]

    def get_absolute_url(self):
        return reverse("classesapp:classes_list")
我的ClassesDetailView是:

class ClassesDetailView(DetailView):
    queryset  = models.Classes.objects.select_related('statistics')
    context_object_name = "class_detail"
    model = models.Classes
    template_name = "classesapp/class_detail.html"
我知道我必须覆盖查询集,我尝试了select_relatad,但仍然找不到解决方案。
提前谢谢你

它将运行2个循环。根据您的模型,
可以有许多
学生
学生
可以有许多
统计数据

更新:


它将运行2个循环。根据您的模型,
可以有许多
学生
学生
可以有许多
统计数据

更新:


嘿,谢谢你的回答。我在壳里试过,但没用。我得到的错误出现在
select\u related('statistics)
select\u related:'statistics'中给出的无效字段名中。选择是:学生\班级
。我试着修好它,但还是不起作用。但是,您提供的这个答案是否有效?我将如何在ClassDetailView中实现它?我认为它会引发一个404错误,类细节没有找到,因为当我在这里询问之前尝试不同的查询时,总是会出现这个错误。再次感谢您的回答。@ptifti删除所选内容_related@ptifti我更新了我的答案。如果是正确的,请接受答案并向上投票。您可以使用@NaveenJain和@NaveenJain选择SQL方面的内容。再次感谢您的回答。您提供的代码正在运行,但它不是我想要的,如果我在students.statistics.all()中使用“`` for student in student:blablabla for stat创建StudentsDetailView,它似乎是学生的默认查询集。再次感谢您的回答!嘿,谢谢你的回答。我在壳里试过,但没用。我得到的错误出现在
select\u related('statistics)
select\u related:'statistics'中给出的无效字段名中。选择是:学生\班级
。我试着修好它,但还是不起作用。但是,您提供的这个答案是否有效?我将如何在ClassDetailView中实现它?我认为它会引发一个404错误,类细节没有找到,因为当我在这里询问之前尝试不同的查询时,总是会出现这个错误。再次感谢您的回答。@ptifti删除所选内容_related@ptifti我更新了我的答案。如果是正确的,请接受答案并向上投票。您可以使用@NaveenJain和@NaveenJain选择SQL方面的内容。再次感谢您的回答。您提供的代码正在运行,但它不是我想要的,如果我在students.statistics.all()中使用“`` for student in student:blablabla for stat创建StudentsDetailView,它似乎是学生的默认查询集。再次感谢您的回答!
result = []  

for student in Students.objects.all(): 

    student_data = {}
    student_data['student_name'] = student.name
    student_data['class_name'] = student.student_class.name
    statistics_data = []  

    for statistics in student.statistics.all():  

        statistics_data.append({
        'dictation_score': statistics.dictation_score,
        'writing_score': statistics.writing_score,
        'grammer_score': statistics.grammer_score,
        'in_class_performance': statistics.in_class_performance
        })  

    student_data['statistics_data'] = statistics_data  

result.append(student_data)