首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

网站搭建-django-学习成绩管理-08-数据库操作之ORM-3

系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3.2 Django:2.1.4 Python:3.6.0

  • 本系列介绍如何搭建一个网站,后端使用django框架
  • 今天开始介绍一个单独的项目app,关于学生成绩管理的网站的搭建
  • 主要功能包括: 学习成绩查询,数据统计分析
  • 涉及前端模块: Datatables、ECharts、JQuery

Part 1:目标

  1. 本文的目标跟大家说说对于数据库的ORM操作,今天说说查询操作的第2种方法:
    • 第1种: constants_list = Constants.objects.values_list(*list_field_name)
    • 第2种: lookup_result = Constants.objects.values(*list_field_name)
  2. 第1种在上一篇文章有介绍,两者的区别是: values_listvalues

Part 2:代码

代码语言:javascript
复制
class SGInputAndCheckView(View):
    def get(self, request):
        list_field_name = ['class_name', 'student_name', 'exam_info', 'course_name']

        print("方法1\n")
        constants_list = Constants.objects.values_list(*list_field_name)
        print(constants_list)
        print("\n")
        list_class_name = [x[0] for x in list(constants_list)]
        list_student_name = [x[1] for x in list(constants_list)]
        list_exam_info = [x[2] for x in list(constants_list)]
        list_course_name = [x[3] for x in list(constants_list)]

        print("list_class_name = ", list_class_name)
        print("list_student_name = ", list_student_name)
        print("list_exam_info = ", list_exam_info)
        print("list_course_name =", list_course_name)

        print("\n方法2\n")
        lookup_result = Constants.objects.values(*list_field_name)
        print(lookup_result)
        print("\n")
        list_class_name_2 = [x["class_name"] for x in list(lookup_result)]
        list_student_name_2 = [x["student_name"] for x in list(lookup_result)]
        list_exam_info_2 = [x["exam_info"] for x in list(lookup_result)]
        list_course_name_2 = [x["course_name"] for x in list(lookup_result)]
        print("list_class_name_2 = ", list_class_name_2)
        print("list_student_name_2 = ", list_student_name_2)
        print("list_exam_info_2 = ", list_exam_info_2)
        print("list_course_name_2 = ", list_course_name_2)

        list_all_class_name = constants_sort(list_class_name)
        list_all_student_name = constants_sort(list_student_name)
        list_all_exam_info = constants_sort(list_exam_info)
        list_all_course_name = constants_sort(list_course_name)

        return render(request, 'sg_first_page.html', {
            'all_class_name': list_all_class_name,
            'all_student_name': list_all_student_name,
            'all_exam_info': list_all_exam_info,
            'all_course_name': list_all_course_name,
        })
    

代码截图

运行结果

第1种方法输出结果constants_list

代码语言:javascript
复制
<QuerySet [('三年1班', '张三', '第1次模拟考', '语文'),
('三年2班', '李四', '第2次模拟考', '数学'),
('三年3班', '王五', '第3次模拟考', '英语'),
(None, '赵六', '第4次模拟考', None),
(None, None, '第5次模拟考', None),
(None, None, '第6次模拟考', None),
(None, None, '第7次模拟考', None),
(None, None, '第8次模拟
考', None), (None, None, '第9次模拟考', None)]>

第2种方法输出结果lookup_result

代码语言:javascript
复制
<QuerySet [{'class_name': '三年1班', 'student_name': '张三', 'exam_info': '第1次模拟考', 'course_name': '语文'},
{'class_name': '三年2班', 'student_name': '李四', 'exam_info': '第2次模拟考', 'course_name': '数学'}, {'class_name': '三年3班', 'student_name': '王五', 'exam_info': '第3次模拟考', 'course_name': '
英语'},
{'class_name': None, 'student_name': '赵六', 'exam_info': '第4次模拟考', 'course_name': None}, {'class_name': None, 'student_name': None, 'exam_info': '第5次模拟考', 'course_name': None}, {'class_name': None, 'student_name': None, 'exam_info': '第6次模拟考', 'course_name': None}, {'class_name': None, 'student_name': None, 'exam_info': '第7次模拟考', 'course_name': None}, {'class_name': None, 'student_name': None, 'exam_info': '第8次模拟考', 'course_name': None}, {'class_name': None, 'student_name': None, 'exam_info': '第9次模拟考', 'course_name': None}]>

Part 3:部分代码解读

  1. 两种方法返回的都是QuerySet对象,第1种方法每一个元素是一个元组,第2种方法每一个元素是一个字典,这就是两者之间的核心区别
  2. 因为每一个元素的不同,在取数的时候也就采用不同的方法:
    • list_class_name = [x[0] for x in list(constants_list)]
    • list_class_name_2 = [x["class_name"] for x in list(lookup_result)]
下一篇
举报
领券