在线学习网站记录之如何获得学习当前课程的用户以及点击我要学习之后的处理

首先,用户要学习当前的课程的入口就是在课程详情的界面点击我要学习按钮,点击这个按钮之后进入课程章节页面,所以在点击这个按钮的时候就更新下usercourse这张表。

所以在UserVideoView这个视图函数中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# course/views.py
class CourseVideoView(View):
def get(self, request, course_id):
if request.user.is_authenticated():
# 获取当前的课程,并且每当用户点击我要学习的时候,该课程的学习人数就自己加1
cur_course = Course.objects.get(id=int(course_id))
# 先判断当前的登录用户是否已经学习了这个课程,如果没学习的话将该课程添加到用户学习课程的数据库中
cur_user_course = UserCourse.objects.filter(user=request.user)
course_list = []
for user_course in cur_user_course:
course_list.append(user_course.course)
if cur_course not in course_list:
user_learn_course = UserCourse()
user_learn_course.user = request.user
user_learn_course.course = cur_course
user_learn_course.save()
# 更新当前课程的学习人数,如果一个用户点击多次我要学习,这个数也只是加1
cur_course.learning_num += 1
cur_course.save()
cur_course_lessons = cur_course.lesson_set.all()
if cur_course:
the_teacher = cur_course.teacher
# 获取学习当前课程的用户还学习了的课程
user_courses = UserCourse.objects.filter(course=cur_course)
user_ids = [user_course.user.id for user_course in user_courses]
all_user_courses = UserCourse.objects.filter(user_id__in=user_ids)
# 先获取所有的课程的id
course_ids = [user_course.course.id for user_course in all_user_courses]
# 根据课程的id获取所有的课程,并且将获得的课程按照点击数降序排序。
# 我们获取了这些课程对象组成的列表之后,获得前三个列表做一个切片,因为可能存在重复的课程,所以我们将列表转换成为集合类型
related_courses = set(Course.objects.filter(id__in=course_ids).order_by("-click_num")[:3])
return render(request, "course-video.html", {
'cur_course': cur_course,
'cur_course_lessons': cur_course_lessons,
'related_courses':related_courses,
})
else:
# return render(request, "login.html", {})
return HttpResponseRedirect(reverse('users:login'))


还有一个点就是我们要获得当前的课程学习人数有两种方法,一种是上面这样在视图函数中进行计算,每一次更新了UserCourse这个数据表之后,就将课程对应的学习人数learning_nums加1,然后更新Course这张表。对应的前端文件:

1
2
# course_detail.html
<span class="fr">学习人数:{{ course.learning_num }}</span>

还有一种是在models中写函数计算:

1
2
3
4
# Course/models.py
# 获取当前课程的学习人数
def get_learning_num(self):
return self.usercourse_set.all().count()

这样的话在前端的代码要修改成:

1
2
# course_detail.html
<span class="fr">学习人数:{{ course.get_learning_num }}</span>

这两种写法都是正确的,但是从效率上来看,第一种效率更高。

原因:

  • 第一种每次更新 UserCourse这个数据表之后,只是对一个值做一次加法运算,后面如果不发生变化(比如另一个用户学习了这门课程),这个数字是不变的,每次通过对象取出这个数据即可
  • 而第二种做法,不管每次访问课程详情页面的时候有没有发生变化,都会遍历一遍UserCourse这张数据表,获取学习当前课程的用户,并且使用count()函数做累加计算,所以相对效率比较低。