Как вывести результат запроса из бд, в шаблон Django
Всем доброго дня!
Я новичок в Django. Столкнулся с проблемой (не пониманием) того, как я могу вывести результат запроса из бд в шаблон Django.
У меня есть такая модель в Django:
models.py
#Cеместры
class SemesterModel(models.Model):
number_semester = models.IntegerField(verbose_name="Номер семестра")
hours_maximum = models.IntegerField(verbose_name="Максимум часов")
hours_solo = models.IntegerField(verbose_name="Часы для самостоятельной работы")
hours_consultation = models.IntegerField(verbose_name="Часы для консультаций")
hours_compulsory = models.IntegerField(verbose_name="Обязательные часы")
hours_lessons = models.IntegerField(verbose_name="Часы для лекций")
hours_practical = models.IntegerField(verbose_name="Часы для практических работ")
hours_seminar = models.IntegerField(verbose_name="Часы для семинаров")
hours_course_work = models.IntegerField(verbose_name="Часы для курсовых работ")
hours_individual_project = models.IntegerField(verbose_name="Часы для индивидуальных проектов")
subject_id = models.ForeignKey(SubjectModel, on_delete=models.CASCADE)
def __str__(self):
return self.name
@property
def hours(self):
return self.hours_maximum + self.hours_solo + self.hours_compulsory + self.hours_consultation + self.hours_lessons + self.hours_practical + self.hours_seminar + self.hours_course_work + self.hours_individual_project
class Meta:
verbose_name = 'Семестр'
verbose_name_plural = 'Семестры'
#Группы
class GroupModel(models.Model):
name = models.CharField(max_length=150, null=True,blank=True)
year_id = models.ForeignKey(YearModel, on_delete=models.CASCADE)
course_id = models.ForeignKey(CourseModel, on_delete=models.CASCADE)
special_id = models.ForeignKey(SpecialModel, on_delete=models.CASCADE)
educational_part_id = models.ForeignKey(EducationalPartModel, on_delete=models.CASCADE)
start_date_autumn = models.DateField(verbose_name='Начало весеннеого семестра')
end_date_autumn = models.DateField(verbose_name='Конец весеннеого семестра')
start_date_spring = models.DateField(verbose_name='Начало осеннего семестра')
end_date_spring = models.DateField(verbose_name='Конец осеннего семестра')
def __str__(self):
return self.name
class Meta:
verbose_name = 'Группа'
verbose_name_plural = 'Группы'
#Нагрузка
class TeacherLoadModel(models.Model):
group_id = models.ForeignKey(GroupModel,on_delete=models.CASCADE)
semester_id = models.ForeignKey(SemesterModel, on_delete=models.CASCADE)
teacher_id = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return "Педагогическая нагрузка"
class Meta:
verbose_name = 'Нагрузка преподавателей'
verbose_name_plural = 'Нагрузка преподавателей'
И есть такой запрос из базы:
SELECT sem.number_semester as 'Номер семестра', gr.name as 'Название группы', us.username as 'ФИО', sub.name as 'Предмет', sem.hours_maximum+sem.hours_solo+sem.hours_consultation+sem.hours_compulsory+sem.hours_lessons+sem.hours_practical+sem.hours_seminar+sem.hours_course_work+sem.hours_individual_project as 'Часы'
FROM main.main_teacherloadmodel tl, main.main_groupmodel gr, main.main_semestermodel sem, main.auth_user us, main.main_subjectmodel sub
where sem.number_semester = 1
and tl.group_id_id = gr.id
and us.id = tl.teacher_id_id
and tl.semester_id_id = sem.id
and sub.id = sem.subject_id_id
Как я могу интерпретировать данный запрос в Python Django, для вывода его в шаблон, таким образом, чтобы результат не изменился, вот что я пытался сделать, но это оказалось без успешным. Создал вью, в которую передал все данные из моделей выше. views.py
def plan(request,group_id):
group = get_object_or_404(GroupModel, pk = group_id)
################################
groups = GroupModel.objects.all()
teacherload = TeacherLoadModel.objects.all()
semesters = SemesterModel.objects.all()
teachers = User.objects.all()
subjects = SubjectModel.objects.all()
hours = SemesterModel.hours
#################################
context = {"groups" : groups, "group" : group, "semesters" : semesters, "hours": hours, "subjects": subjects, "teacherload":teacherload, "teachers" : teachers}
return render(request, 'main/deportament/plan.html',context)
Затем приступил к выводу данной таблицы, в html шаблон:
<tbody>
<tr>
{% for tl in teacherload %}
<td>1</td>
{% if tl.group_id == group.id%}
<td>{{ group.name }}</td>
{% endif %}
{% for teacher in teachers %}
{% if tl.teacher_id == teacher.id %}
<td>{{teacher.username}}</td>
{% endif %}
{% endfor %}
{% for semester in semesters %}
{% if tl.semester_id == semester.id %}
<td>Семестр {{semester.id}}</td>
<td>{{ hours }}</td>
{% endif %}
{% endfor %}
{% endfor %}
</tr>
</tbody>
Ожидал увидеть следующий результат:

Ответы (1 шт):
Я тоже не умею пока делать красивые фильтры, но закинул ваши модельки себе в учебный джанго проект. Создал через админку объекты и вот что получилось.
models.py
class SemesterModel(models.Model):
subject = models.CharField(max_length=150)
number_semester = models.IntegerField(verbose_name="Номер семестра")
hours_maximum = models.IntegerField(verbose_name="Максимум часов")
def __str__(self):
return '{0} '.format(self.subject,self.number_semester)
class Meta:
verbose_name = 'Cеместр'
verbose_name_plural = 'Семестры'
class GroupModel(models.Model):
name = models.CharField(max_length=150)
def __str__(self):
return '{0} '.format(self.name)
class Meta:
verbose_name = 'Группа'
verbose_name_plural = 'Группы'
class TeacherLoadModel(models.Model):
group = models.ForeignKey(GroupModel,on_delete=models.CASCADE)
semester = models.ForeignKey(SemesterModel, on_delete=models.CASCADE)
teacher = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return '{0} '.format(self.teacher)
class Meta:
verbose_name = 'Препод'
verbose_name_plural = 'Преподы'
urls.py
path("get/semester/<int:pk>/",GetSemestrPageView.as_view())
views.py
class GetSemestrPageView(TemplateView):
""""""
template_name = 'app_name/your_page.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
pk = self.kwargs.get('pk')
current_semester = SemesterModel.objects.get(id=pk)
teacher = TeacherLoadModel.objects.filter(semester=current_semester)
teacher=teacher.first()
print('номер семестра',teacher.semester.number_semester)
print('фио',teacher,'предмет',teacher.semester.subject,'часы',teacher.semester.hours_maximum)
context['teacher'] = teacher
return context
номер семестра 7
фио root предмет Операционные системы и среды часы 48
В шаблоне просто получите объект {{teacher}}