Как получить все данные из 3 разных таблиц в одном запросе? - PullRequest
1 голос
/ 29 сентября 2019

Я хочу сделать следующее, но я не понимаю, как я это сделаю:

Для каждого класса покажите мне всех учеников в этом классе и для каждого ученика в этом классе покажите мне всю статистикумоего студента.

мои модели:

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, новсе еще не могу найти решение. Заранее спасибо!

1 Ответ

0 голосов
/ 03 октября 2019

Он будет проходить через 2 цикла. в соответствии с вашими моделями class может иметь много students, а student может иметь много statistics.
обновлено:

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)
...