【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 на основе поисковой системы. Этот результат является средним показателем удовлетворенности каждого профессора.