Как вычислить суммарные оценки студентов в django с помощью функции total и сортировки
модельный класс
from django.db import models
class Student(models.Model):
Name = models.CharField(max_length=50,)
Roll_no = models.IntegerField(default = 0 , unique = True )
Emailid = models.EmailField(max_length=54 )
Submrk1 = models.PositiveIntegerField()
Submrk2 = models.PositiveIntegerField()
Submrk3 = models.PositiveIntegerField()
Total = models.IntegerField(default = total)
def __str__(self):
return self.Name + self.Total
def total(self):
self.Total = self.Submrk1 + self.Submrk2 + self.Submrk3
return self.Total
просмотров
from django.shortcuts import render , redirect from .models import Student from django.shortcuts import HttpResponseRedirect
def liststu(request):
student = Student.objects.all()
return render(request, 'liststu.html',{'student': student})
def Createstu(request):
if request.method == 'POST':
name = request.POST.get('name')
rollno = request.POST.get('rollno')
email = request.POST.get('email')
sub1 = request.POST.get('sub1')
sub2 = request.POST.get('sub2')
sub3 = request.POST.get('sub3')
stu = Student.objects.create(Name = name,Roll_no = rollno, Emailid = email, Submrk1 = sub1, Submrk2 = sub2 , Submrk3 = sub3)
return HttpResponseRedirect('list')
else:
return render(request, 'create.html')
def sort(request):
ctx = Student.objects.order_by('Total')
return render(request, 'liststu.html' , {'student':ctx})
Для получения общего количества оценок вы можете либо:
Обновляйте поле
total
при каждом сохранении студента, переопределив функцию.save()
, например,def save(self, *args, **kwargs): self.total = self.get_total super(Student, self).save(*args, **kwargs)
Используйте аннотацию Django для добавления итоговой суммы путем сложения ваших оценок:
from django.db.models import F students = Student.objects.annotate(total=F('Submrk1')+F('Submrk2')+F('Submrk3'))
Однако обратите внимание, что вы не можете аннотировать total
, если это уже поле модели. Вы также не должны создавать метод модели, который конфликтует с существующим полем (опять же, total
).
В качестве дополнения, я бы предложил создать отдельную модель для ваших оценок, которая позволит вам создавать любое количество оценок и при этом использовать аннотацию для получения итоговой суммы.