教程总体简介:数据模型、模板管理、模板管理业务流程、模板制作、GridFS研究、模板存储、静态化测试、页面预览、页面预览开发、页面预览测试、4 添加“页面预览”链接、页面发布、需求分析、技术方案、页面发布消费方、测试、课程管理、环境搭建、我的课程、我的课程后端、我的课程前端、数据字典、新增课程页面完善、新增课程服务端、新增课程前端、课程信息修改、课程管理页面说明、服务端、前端、课程计划、课程计划查询、页面原型、添加课程计划、页面原型说明、课程图片、上传图片开发、项目概述、项目背景、项目的功能构架、项目的技术架构、CMS、什么是CMS、CMS需求分析与工程搭建、静态门户工程搭建、图片查询、课程图片删除、服务端开发、前端开发、课程预览、课程预览技术方案、课程详情页面静态化、静态页面测试、课程数据模型查询接口、课程信息模板设计、课程预览功能开发、CMS页面预览测试、CMS添加页面接口、课程预览服务端、课程发布、CMS一键发布接口、课程发布接口、搜索服务、课程搜索需求分析、课程索引、准备课程索引信息、搭建ES环境、Logstash创建索引、搜索前端技术需求、了解SEO、服务端渲染和客户端渲染、Nuxt.js入门、Nuxt.js介绍、创建Nuxt工程、页面布局、路由、搜索页面、分页查询、按分类搜索、集成测试、在线学习与媒资管理、在线学习需求分析、需求描述、视频点播解决方案、视频编码、视频编码格式、生成m3u8/ts文件、播放器、CMS页面管理需求、后端工程搭建、导入CMS数据库、MongoEngine入门、在Django中使用MongoDB、定义文档、开发环境、上传文件、断点续传
全套教程部分目录:
增加数据
学习目标
- 掌握增加数据的方法
1 增加数据
增加数据有两种方法。
1、save
通过创建文档类对象,执行对象的save()方法保存到数据库中。
>>> from datetime import date
>>> book = BookInfo(
btitle='西游记',
bpub_date=date(1988,1,1),
bread=10,
bcomment=10
)
>>> book.save()
>>> book.id # 新增对象的id为一个ObjectId对象
ObjectId('5d677f75bffe27a8e83b6223')
>>> hero = HeroInfo(
hname='孙悟空',
hgender=0,
hbook=book
)
>>> hero.save()
>>> hero2 = HeroInfo(
hname='猪八戒',
hgender=0,
hbook=book.id
)
>>> hero2.save()
2、create
通过模型类.objects.create()保存。
>>> HeroInfo.objects.create(
hname='沙和尚',
hgender=0,
hbook=book
)
<HeroInfo: 沙和尚>
2 小结
-
增加数据有两种方法
- 通过创建文档类对象,执行对象的save()方法
- 通过模型类.objects.create()保存
修改数据
学习目标
掌握修改数据的方法
1 修改数据
修改数据有两种方法
1、save
修改模型类对象的属性,然后执行save()方法
hero = HeroInfo.objects.get(hname='猪八戒')
hero.hname = '猪悟能'
hero.save()
2、update
使用模型类.objects.filter().update(),会返回受影响的行数
HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
2 小结
-
修改更新有两种方法
- 修改模型类对象的属性,然后执行save()方法
- 使用模型类.objects.filter().update()
删除数据
学习目标
- 掌握删除数据的方法
1 删除数据
删除有两种方法
1、文档类对象.delete()
>>> hero = HeroInfo.objects.get(hname='猪悟能')
>>> hero.delete()
2、文档类.objects.filter().delete()
>>> HeroInfo.objects.filter(hname='沙悟净').delete()
2 小结
-
删除有两种方法
- 文档类对象.delete()
- 文档类.objects.filter().delete()
查询数据
学习目标
- 掌握基本查询方法
- 掌握对结果集进行过滤的方法
1 基本查询
get 查询单一结果,如果不存在会抛出文档类DoesNotExist异常。
all 查询多个结果。
count 查询结果数量。
>>> BookInfo.objects.all()
[<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>, <BookInfo: 西游记>]
>>> book = BookInfo.objects.get(btitle='西游记')
>>> book.id
ObjectId('5d677f75bffe27a8e83b6223')
>>> BookInfo.objects.get(id='5d6772e94bd611a8efe98c14')
<BookInfo: 笑傲江湖>
>>> BookInfo.objects.get(pk='5d6772e94bd611a8efe98c14')
<BookInfo: 笑傲江湖>
>>> BookInfo.objects.get(id='5d6772e94bd611a8efe98c54')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/apple/workspace/virtualenv/vue_shop/lib/python3.6/site-packages/mongoengine/queryset/base.py", line 272, in get
raise queryset._document.DoesNotExist(msg)
cms.test_models.DoesNotExist: BookInfo matching query does not exist.
>>> BookInfo.objects.count()
6
2 过滤查询
要对结果集进行过滤,可使用如下方法:
- filter 过滤出多个结果
- exclude 排除掉符合条件剩下的结果
- get 过滤单一结果
- 直接在文档类.objects()中传入过滤条件
对于过滤条件的使用,上述几个方法相同,故仅以filter进行讲解。
过滤条件的表达语法如下:
属性名称__比较运算符=值
# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
1、比较查询
- ne 不等于(not equal to)
- gt 大于 (greater than)
- gte 大于等于 (greater than or equal to)
- lt 小于 (less than)
- lte 小于等于 (less than or equal to)
2、范围查询
- in 是否包含在范围内。
- nin 是否不包含在范围内。
>>> BookInfo.objects.filter(btitle__in=['西游记', '雪山飞狐', '天龙八部'])
3、字符串查询
- exact – 与指定值完全匹配
- contains – 包含指定值
- startswith – 以指定值开始
- endswith – 以指定值结束
>>> BookInfo.objects.filter(btitle__contains='传')
>>> BookInfo.objects.filter(btitle__endswith='部')
3 小结
-
基础查询
get 查询单一结果
all 查询多个结果
count 查询结果数量
-
过滤查询
- 过滤条件的表达语法:属性名称__比较运算符=值
- 比较查询:ne、gt、gte、lt、lte
- 范围查询:in、nin
- 字符串查询:exact、contains、startswith、endswith
Q对象
学习目标
- 掌握Q对象的使用方法
1 Q对象
多个过滤器逐个调用表示逻辑与关系。
例:查询阅读量大于20,并且评论量小于30的图书。
>>> BookInfo.objects.filter(bread__gt=20, bcomment__lt=30)
或
>>> BookInfo.objects.filter(bread__gt=20).filter(bcomment__lt=30)
如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符。
语法如下:
Q(属性名__运算符=值)
例:查询阅读量大于20的图书,改写为Q对象如下。
>>> from mongoengine import Q
>>> BookInfo.objects.filter(Q(bread__gt=20))
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
例:查询阅读量大于20,或评论量小于30的图书,只能使用Q对象实现
>>> BookInfo.objects.filter(Q(bread__gt=20)|Q(bcomment__lt=30))
MongoEngine中的Q对象前不可以使用~操作符。
2 小结
- 语法如下:Q(属性名__运算符=值)
- Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或
其他
学习目标
- 掌握常用聚合函数的用法
- 掌握排序的用法
- 掌握关联查询的方法
1 聚合函数
常用的聚合函数有count 计数,sum 求和,average 求平均值
>>> BookInfo.objects.count()
5
>>> BookInfo.objects.sum('bread')
136.0
>>> BookInfo.objects.average('bread')
27.2
2 排序
使用order_by对结果进行排序
>>> BookInfo.objects.order_by('bread') # 升序
>>> BookInfo.objects.order_by('-bread') # 降序
3 关联查询
1、由一到多的访问语法:
需要进行两步查询,例如:
>>> b = BookInfo.objects.get(btitle='雪山飞狐')
>>> HeroInfo.objects(hbook=b)
主要是因为MongoDB不支持连表
>>> HeroInfo.objects(hbook__btitle='西游记')
Traceback (most recent call last):
File "/Users/apple/workspace/virtualenv/vue_shop/lib/python3.6/site-packages/mongoengine/queryset/transform.py", line 62, in query
fields = _doc_cls._lookup_field(parts)
File "/Users/apple/workspace/virtualenv/vue_shop/lib/python3.6/site-packages/mongoengine/base/document.py", line 1017, in _lookup_field
'__'.join(parts))
mongoengine.errors.LookUpError: Cannot perform join in mongoDB: hbook__btitle
2、由多到一的访问语法:
多对应的文档类对象.一对应引用字段属性名 例:
>>> h = HeroInfo.objects.get(hname='郭靖')
>>> h.hbook
3、访问一对应的文档类关联对象的id语法:
多对应的文档类对象.一对应引用字段属性名.id
例:
>>> h = HeroInfo.objects.get(hname='郭靖')
>>> h.hbook.id
4 小结
-
常用的聚合函数
- count 计数
- sum 求和
- average 求平均值
使用order_by对结果进行排序.order_by('bread')是升序,.order_by('-bread')是降序
-
关联查询
- 由一到多的访问语法:需要进行两步查询,MongoDB不支持连表查询
- 由多到一的访问语法:多对应的文档类对象.一对应引用字段属性名
- 访问一对应的文档类关联对象的id语法:多对应的文档类对象.一对应引用字段属性名.id
查询集 QuerySet
学习目标
- 了解查询集的概念
- 熟悉查询集的基本操作
1 概念
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
当调用如下过滤器方法时,返回查询集(而不是简单的列表):
- all():返回所有数据。
- filter():返回满足条件的数据。
- exclude():返回满足条件之外的数据。
- order_by():对结果进行排序。
注:文档类.objects也会返回包含所有数据的查询集
对查询集可以再次调用过滤器进行过滤,如
BookInfo.objects.filter(bread__gt=30).order_by('bpub_date')
也就意味着查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果。
判断某一个查询集中是否有数据:
- 使用 len() 查看查询集的长度是否为0
- 空的查询集相当于 False,可直接用于条件判断
2 限制查询集
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。
注意:不支持负数索引。
对查询集进行切片后返回一个新的查询集,不会立即执行查询。
如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()如果没有数据引发DoesNotExist异常。
示例:获取第1、2项,运行查看。
qs = BookInfo.all()[0:2]
``