Попадание в топ-3 самых посещаемых студентами курсов

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

Я отфильтровал курсы, которые есть у преподавателя, нашел студентов, которые записались на эти курсы, но не могу получить 3 самых посещаемых курса. Самые посещаемые курсы должны быть подсчитаны на основе того, сколько студентов записалось на курс.

models.py

class Enrollment(models.Model):
student = models.ForeignKey(User, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
enrollment_date = models.DateField(auto_now_add=True, null = True)

class Course(models.Model):
user = models.ForeignKey(Users, on_delete = models.CASCADE)
media = models.ImageField(upload_to = 'media/course')
title = models.CharField(max_length=300, null = False)
subtitle = models.CharField(max_length=500, null = False)
description = models.TextField(max_length=5000, null = False)
language = models.CharField(max_length=20, null = False, choices=LANGUAGE)
level = models.CharField(max_length=20, null = False, choices=LEVEL)
category = models.CharField(max_length=30, null = False, choices=CATEGORY)
subcategory = models.CharField(max_length=20, null = False)
price = models.FloatField(null = True)
roles_responsibilities = models.TextField(max_length=2500, null = False)
timeline_budget = models.TextField(max_length=250, null = False)
req_prerequisite = models.TextField(max_length=2500, null = False)
certificate = models.CharField(max_length=5, null = False, choices=CERTIFICATE)
slug = AutoSlugField(populate_from='title', max_length=500, unique=True, null=True)

views.py

def instructorDashboard(request):
user = Users.objects.all()
user_id = Users.objects.get(user_id=request.user)
course = Course.objects.filter(user = user_id) #has been filtered

for c in course:
    student = Enrollment.objects.filter(course=c)
    student_count = student.annotate(count=Count('course')).order_by('-count')[:3]
    print(student_count)


context = {
  'student_count': student_count, 
  
return render(request, 'instructor_dashboard/index.html', context)

Ожидается: Получить список курсов с большим количеством зачислений.

В Django, если мы используем ForeignKey, вы можете легко получить все строки (Enrollment), которые находятся в отношениях с одной строкой (Course), используя параметр 'realted_name'.

models.py

class Enrollment(models.Model):
    student = models.ForeignKey(User, on_delete=models.CASCADE)
    course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='enrollment')
    enrollment_date = models.DateField(auto_now_add=True, null = True)

views.py

 # Get the user object and filter the course that are created by user.
 # Retrieve all the enrollments for every course created by user and sort in descending order.
 # courses_list will be having all the courses that are created by the user.
 courses_ranking = []
 for course in courses_list:
     courses_ranking.append({'course_id': course.id, 'count':course.enrollment.count()})
 # After this, courses_ranking will be having list of dict objects that contains courses_id and specific enrollment count. If you sort that dictionary based on the "count" key, you will get the required sorted list.
 result = sorted(courses_ranking, key=lambda x: x[1], reverse=True)
 # result will have list of courses with highest to lowest enrollments(descending order).
Вернуться на верх