Форум сайта python.su
0
Здравствуйте!
Имеется база студентов и их оценки по разным предметам, нужно вывести список студентов отсортированный по возрастанию средней оценки:
class Student(models.Model): class Meta(): db_table="student" student_name = models.CharField(max_length = 30) class Rating(models.Model): class Meta(): db_table="rating" rating_lesson = models.IntegerField() rating_student = models.ForeignKey(Student)
SELECT student_name, (AVG(rating_lesson)) AS rating FROM student INNER JOIN rating ON rating.rating_student_id=student.id GROUP BY student.id ORDER BY rating DESC
return render_to_response('site.html', {'student' : Student.objects.all().filter(rating__rating_student_id=Student.objects.all()).annotate(total=Count('id')).order_by('-rating__rating_lesson')})
{% for name in student %}
<tr>
<td>{{ name.student_name }}</td>
<td>тут должна быть средняя оценка</td>
</tr>
{% endfor %}
Отредактировано sedoi (Март 3, 2014 21:59:24)
Офлайн
103
{% for name in student %} <tr> <td>{{ name.student_name }}</td> <td>{{ name.rating_set.rating_lesson }}</td> </tr> {% endfor %}
{% for name in student %} <tr> <td>{{ name.student_name }}</td> <td>{% for ratings in name.rating_set.all %} {{ ratings.rating_lesson }} {% endfor %} </td> </tr> {% endfor %}
Отредактировано terabayt (Март 3, 2014 19:12:47)
Офлайн
0
terabaytДа, спасибо, а как можно получить среднюю оценку?
from django.db import connection, transaction cursor = connection.cursor() cursor.execute('''SELECT student_name, ROUND(AVG(rating_lesson), 2) AS avg_rating FROM student INNER JOIN rating ON rating.rating_student_id=student.id GROUP BY student.id ORDER BY avg_rating DESC''') out = [] while(True): row = cursor.fetchone() if(row == None): break else: out.append(row) return render_to_response('site.html', {'student' : out})
Отредактировано sedoi (Март 3, 2014 22:33:56)
Офлайн
103
Чистый sql это всегда красиво!
А для большей красоты
while True: row = cursor.fetchone() if not row: break out.append(row)
out = [i for i in cursor.fetchone()]
Отредактировано terabayt (Март 4, 2014 00:49:02)
Офлайн
22
Student
sedoiвроде так
А необходимо узнать среднюю оценку каждого студента и вывести в список по возрастанию. Для примера выше было бы так:
Student.objects.values('student_name').aggregate(avg=Avg('rating__rating_lesson')).ordr_by('avg')
Офлайн