Отчеты о посещаемости с использованием django

  1. У меня есть класс Student и класс Attendance, где student var in Attendance является ForeignKey класса Student и класс Student содержит User как OneToOneField.
  2. Теперь, когда я учитываю посещаемость с помощью функции takeattendance в views.py, посещаемость сохраняется правильно в классе Attendance class, But I have 3 logins hod, staff and student
  3. .
  4. Когда сотрудники добавляют посещаемость, я хочу, чтобы конкретный студент должен получить подсчет посещаемости в процентах.
  5. Я не могу получить логику для этого. Пожалуйста, помогите мне с этим
  6. .

Models.py

class Student(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    branch = models.ForeignKey(Course,on_delete=models.CASCADE,null=True,blank=True)
    middle_name = models.CharField(max_length=50,null=True)
    roll_no = models.IntegerField()
    mobile_no = PhoneNumberField(default='')
    parents_mobile_no = PhoneNumberField(default='')
    year = models.ForeignKey(Year,on_delete=models.CASCADE)
    division = models.ForeignKey(Division,on_delete=models.CASCADE)
    batch = models.ForeignKey(Batch,on_delete=models.CASCADE)
    semester = models.ForeignKey(Semester,on_delete=models.CASCADE, null=True,blank=True)

class Attendance(models.Model):
    id = models.AutoField(primary_key=True)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    status = models.CharField(max_length=15)

views.py

def takeattendance(request):
    if request.method == "POST":
        subject = Subject.objects.get(id=request.POST['subject'])
        student_ids = request.POST.getlist('student_name')
        status_list = request.POST.getlist('status')

        attendance_objs = []
        for sid, status in zip(student_ids, status_list):
            attendance_objs.append(
                Attendance(
                  subject=subject,
                  student=Student.objects.get(id=sid),
                  status=status
                )
            )
        
        Attendance.objects.bulk_create(
                attendance_objs
        )

        if request.user.is_authenticated and request.user.user_type == 2:
           return render(request,'ms/hod/Attendance.html')
        elif request.user.is_authenticated and request.user.user_type == 3:
           return render(request,'ms/staff/Attendance.html')
        else:
            return HttpResponse("Failed")

    else:    
        return HttpResponse("Failed") 

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

Посещаемость класса в целом

total_of_days_attendance_was_taken = Attendance.objects.all().values_list('date').distinct().count()

total_students = Student.objects.all().count()

target_total = total_of_days_attendance_was_taken*total_students

total_attendance = Attendance.objects.all().count()

entire_class_percent = '{0}%'.format((total_attendance/target_total)*100)

Посещаемость по студентам

total_of_days_attendance_was_taken = Attendance.objects.all().values_list('date').distinct().count()

per_student = {}
for i in Student.objects.all():
    total_for_student = Attendance.objects.filter(student=i).count()
    sudent_percent = '{0}%'.format((total_for_student/total_of_days_attendance_was_taken)*100)
    per_student[i.user.username] = sudent_percent

Собственный коэффициент посещаемости студента

total_of_days_attendance_was_taken = Attendance.objects.all().values_list('date').distinct().count()
total_for_student = Attendance.objects.filter(student=request.user).count()

sudent_percent = '{0}%'.format((total_for_student/total_of_days_attendance_was_taken)*100)
Вернуться на верх