MySQL запрос не отображается на странице Django HTML - PullRequest
0 голосов
/ 24 апреля 2020

В настоящее время я пытаюсь принять определенные c запросы баз данных и отобразить их на странице HTML. Я работаю на Django Framework с mySQL в качестве базы данных. Я успешно выполнил запросы в mySQL, и сервер не выдает мне никаких ошибок, поэтому я заблудился, где go дальше.

Мой файл views.py, где у меня есть запросы

from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from student.models import StudentDetails, CourseDetails
from django.db import connection
from django.core.paginator import Paginator

def dictfetchall(cursor):
    "Return all rows from a cursor as a dict"
    columns = [col[0] for col in cursor.description]
    return [
        dict(zip(columns, row))
        for row in cursor.fetchall()
    ]
# Create your views here.
@login_required
def home(request):

    cursor = connection.cursor()
    cursor.execute("SELECT COUNT(*) 'totalstudents' FROM student_studentdetails")
    cursor.execute("SELECT COUNT(*) 'totalseniors' FROM student_studentdetails WHERE year='Senior' ")
    cursor.execute("SELECT COUNT(*) 'totaljuniors' FROM student_studentdetails WHERE year='Junior' ")
    cursor.execute("SELECT COUNT(*) 'totalfreshman' FROM student_studentdetails WHERE year='Freshman' ")
    cursor.execute("SELECT COUNT(*) 'coursecount' FROM student_coursedetails")
    cursor.execute("SELECT AVG(GPA) 'averagegpa' FROM student_studentdetails")
    homedata =  dictfetchall(cursor)


    return render(request, 'student/home.html', {'data' : homedata})

Мой дом. html, куда они должны загружаться. Эстетика того, как они отображаются, сейчас второстепенна, я все еще пытаюсь понять, как извлечь данные, не используя строки, но это на другой день.

{% extends 'student/base.html' %}

{% block content %}

<tbody>
  {% for row in data %}
    <tr>
        <td> {{ row.averagegpa }} </td>
        <td> {{ row.totalstudents}} </td>
        <td> {{ row.totalseniors}} </td>
        <td> {{ row.totaljuniors}} </td>
        <td> {{ row.totalfreshman}} </td>
        <td> {{ row.coursecount}} </td>
    </tr>
  {% endfor %}
</tbody>



{% endblock %}

и это то, что я вижу, когда запускаю свой сервер и go на домашнюю страницу

Only averaggpa is showing

1 Ответ

0 голосов
/ 24 апреля 2020

Проблема в том, что вы выполняете запросы один за другим, фактически не восстанавливая промежуточные результаты - за исключением последнего запроса, который дает вам средний балл по всем студентам.

Даже если бы вы были, это все еще кажется неоптимальным подходом. Помимо подсчета курса, полученного из другой таблицы, вы можете получить всю информацию за один запрос, используя условное агрегирование для таблицы student_studentdetails:

select
    count(*) totalstudents,
    sum(year = 'Senior') totalseniors,
    sum(year = 'Junior') totaljuniors,
    sum(year = 'Freshman') totalfreshman,
    avg(gpa) average gpa
from student_studentdetails

Таким образом, вам просто нужно два запроса для получить данные (вам нужно получить данные между ними!).

Вы можете даже объединить другой запрос следующим образом:

select
    count(*) totalstudents,
    sum(year = 'Senior') totalseniors,
    sum(year = 'Junior') totaljuniors,
    sum(year = 'Freshman') totalfreshman,
    avg(gpa) average gpa,
    (select count(*) from student_coursedetails) course_count
from student_studentdetails
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...