Как вычислить суммарные оценки студентов в 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})

Для получения общего количества оценок вы можете либо:

  1. Обновляйте поле total при каждом сохранении студента, переопределив функцию .save(), например,

    def save(self, *args, **kwargs):
       self.total = self.get_total
       super(Student, self).save(*args, **kwargs)
    
  2. Используйте аннотацию Django для добавления итоговой суммы путем сложения ваших оценок:

    from django.db.models import F
    
    students = Student.objects.annotate(total=F('Submrk1')+F('Submrk2')+F('Submrk3'))
    

Однако обратите внимание, что вы не можете аннотировать total, если это уже поле модели. Вы также не должны создавать метод модели, который конфликтует с существующим полем (опять же, total).

В качестве дополнения, я бы предложил создать отдельную модель для ваших оценок, которая позволит вам создавать любое количество оценок и при этом использовать аннотацию для получения итоговой суммы.

Вернуться на верх