【Django】Как показать результаты вычисления столбцов дочерних таблиц

Цель - получить средние значения столбцов дочерних таблиц. Мои модели - это отношения "Один ко многим". (Здесь, Один:Профессор, Многие:Оценка). На основе каждой одной таблицы (Model:Professor) я хочу получить средние значения столбцов (Model:Evaluation, column:satisfaction). При показе каждого среднего значения на основе профессоров, результаты должны быть показаны на основе поисковой системы, написанной в views.py.

Проблема следующих кодов в том, что результаты не могут быть показаны в professors/professor_list.html.

models.py

class Professor(models.Model):
    college = models.CharField(max_length=50, choices=COLLEGE_CHOICES)
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class Evaluation(models.Model):
    name = models.ForeignKey(Professor, on_delete=models.CASCADE, related_name='evaluation_names', null=True)
    college = models.ForeignKey(Professor, on_delete=models.CASCADE, related_name='evaluation_colleges', null=True)
    satisfaction = models.IntegerField(choices=SATISFACTION_CHOICES)

    def __str__(self):
        return self.comment

views.py


from .models import Professor, Evaluation
from django.views import generic

from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Q, Avg


class ProfessorList(generic.ListView):
    model = Professor
    template_name = "professors/professor_list.html"

    def get_queryset(self):
        q_word = self.request.GET.get('query')

        selected_name = self.request.GET.get('name')
        selected_college = self.request.GET.get('college')

        if q_word:
            if selected_name and selected_college:
                professor_list = Professor.objects.filter(
                    Q(name__icontains=q_word) | Q(college__icontains=q_word)
                )
                s_list = Evaluation.objects.filter(
                    Q(name__icontains=q_word) | Q(college__icontains=q_word)
                ).annotate(avg_satisfactions=Avg('satisfaction'))
            elif selected_college:
                professor_list = Professor.objects.filter(
                    Q(college__icontains=q_word)
                )
                s_list = Evaluation.objects.filter(
                    Q(college__icontains=q_word)
                ).annotate(avg_satisfactions=Avg('satisfaction'))
            else:
                professor_list = Professor.objects.filter(
                    Q(name__icontains=q_word)
                )
                s_list = Evaluation.objects.filter(
                    Q(college__icontains=q_word)
                ).annotate(avg_satisfactions=Avg('satisfaction'))
        else:
            professor_list = Professor.objects.all()
            s_list = Evaluation.objects.annotate(avg_satisfactions=Avg('satisfaction'))

        return professor_list, s_list

professors/professor_list.html

    <form action="" method="get" class="#">
      <input name="query" value="{{ request.GET.query }}" type="text" class="#">
      <div class="">
         <button type="submit" class="#">検索する</button>
         <a href="./" class="submit btn">クリア</a>
         <input type="checkbox" name="college" value="1" class="#">大学名
           <input type="checkbox" name="name" value="2" class="#">教授名
     </div>
    </form>
    <div class="#">
        {% for professor in professor_list %}
        <a href="detail/{{ professor.id }}">{{ professor.name }}</a>
        {% endfor %}
        {% for s in s_list %}
        <p>{{ s.avg_satisfaction }}</p>
        {% endfor %}
    </div>

Я хочу выводить результаты в html на основе поисковой системы. Этот результат является средним показателем удовлетворенности каждого профессора.

Вернуться на верх