
教程总体简介:数据模型、模板管理、模板管理业务流程、模板制作、GridFS研究、模板存储、静态化测试、页面预览、页面预览开发、页面预览测试、4 添加“页面预览”链接、页面发布、需求分析、技术方案、页面发布消费方、测试、课程管理、环境搭建、我的课程、我的课程后端、我的课程前端、数据字典、新增课程页面完善、新增课程服务端、新增课程前端、课程信息修改、课程管理页面说明、服务端、前端、课程计划、课程计划查询、页面原型、添加课程计划、页面原型说明、课程图片、上传图片开发、项目概述、项目背景、项目的功能构架、项目的技术架构、CMS、什么是CMS、CMS需求分析与工程搭建、静态门户工程搭建、图片查询、课程图片删除、服务端开发、前端开发、课程预览、课程预览技术方案、课程详情页面静态化、静态页面测试、课程数据模型查询接口、课程信息模板设计、课程预览功能开发、CMS页面预览测试、CMS添加页面接口、课程预览服务端、课程发布、CMS一键发布接口、课程发布接口、搜索服务、课程搜索需求分析、课程索引、准备课程索引信息、搭建ES环境、Logstash创建索引、搜索前端技术需求、了解SEO、服务端渲染和客户端渲染、Nuxt.js入门、Nuxt.js介绍、创建Nuxt工程、页面布局、路由、搜索页面、分页查询、按分类搜索、集成测试、在线学习与媒资管理、在线学习需求分析、需求描述、视频点播解决方案、视频编码、视频编码格式、生成m3u8/ts文件、播放器、CMS页面管理需求、后端工程搭建、导入CMS数据库、MongoEngine入门、在Django中使用MongoDB、定义文档、开发环境、上传文件、断点续传

项目完整code和文档,小伙伴们---->git仓库
项目完整code和文档,小伙伴们---->git仓库
全套教程部分目录:


增加数据
学习目标
1 增加数据
增加数据有两种方法。
1、save
通过创建文档类对象,执行对象的save()方法保存到数据库中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> 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()保存。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> HeroInfo.objects.create(
hname='沙和尚',
hgender=0,
hbook=book
)
<HeroInfo: 沙和尚>
|
2 小结
-
增加数据有两种方法
-
通过创建文档类对象,执行对象的save()方法
- 通过模型类.objects.create()保存
修改数据
学习目标
掌握修改数据的方法
1 修改数据
修改数据有两种方法
1、save
修改模型类对象的属性,然后执行save()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| hero = HeroInfo.objects.get(hname='猪八戒')
hero.hname = '猪悟能'
hero.save()
|
2、update
使用模型类.objects.filter().update(),会返回受影响的行数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
|
2 小结
-
修改更新有两种方法
-
修改模型类对象的属性,然后执行save()方法
- 使用模型类.objects.filter().update()
删除数据
学习目标
1 删除数据
删除有两种方法
1、文档类对象.delete()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> hero = HeroInfo.objects.get(hname='猪悟能')
>>> hero.delete()
|
2、文档类.objects.filter().delete()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> HeroInfo.objects.filter(hname='沙悟净').delete()
|
2 小结
-
删除有两种方法
-
文档类对象.delete()
- 文档类.objects.filter().delete()
查询数据
学习目标
1 基本查询
get 查询单一结果,如果不存在会抛出文档类DoesNotExist异常。
all 查询多个结果。
count 查询结果数量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 属性名称__比较运算符=值
# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
|
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 是否不包含在范围内。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> BookInfo.objects.filter(btitle__in=['西游记', '雪山飞狐', '天龙八部'])
|
3、字符串查询
- exact – 与指定值完全匹配
- contains – 包含指定值
- startswith – 以指定值开始
- endswith – 以指定值结束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> 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对象
学习目标
1 Q对象
多个过滤器逐个调用表示逻辑与关系。
例:查询阅读量大于20,并且评论量小于30的图书。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> BookInfo.objects.filter(bread__gt=20, bcomment__lt=30)
或
>>> BookInfo.objects.filter(bread__gt=20).filter(bcomment__lt=30)
|
如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符。
语法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| |
例:查询阅读量大于20的图书,改写为Q对象如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> from mongoengine import Q
>>> BookInfo.objects.filter(Q(bread__gt=20))
|
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
例:查询阅读量大于20,或评论量小于30的图书,只能使用Q对象实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> BookInfo.objects.filter(Q(bread__gt=20)|Q(bcomment__lt=30))
|
MongoEngine中的Q对象前不可以使用~操作符。
2 小结
- 语法如下:Q(属性名__运算符=值)
- Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或
其他
学习目标
- 掌握常用聚合函数的用法
- 掌握排序的用法
- 掌握关联查询的方法
1 聚合函数
常用的聚合函数有count 计数,sum 求和,average 求平均值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> BookInfo.objects.count()
5
>>> BookInfo.objects.sum('bread')
136.0
>>> BookInfo.objects.average('bread')
27.2
|
2 排序
使用order_by对结果进行排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> BookInfo.objects.order_by('bread') # 升序
>>> BookInfo.objects.order_by('-bread') # 降序
|
3 关联查询
1、由一到多的访问语法:
需要进行两步查询,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> b = BookInfo.objects.get(btitle='雪山飞狐')
>>> HeroInfo.objects(hbook=b)
|
主要是因为MongoDB不支持连表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> 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、由多到一的访问语法:
多对应的文档类对象.一对应引用字段属性名 例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> h = HeroInfo.objects.get(hname='郭靖')
>>> h.hbook
|
3、访问一对应的文档类关联对象的id语法:
多对应的文档类对象.一对应引用字段属性名.id
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> h = HeroInfo.objects.get(hname='郭靖')
>>> h.hbook.id
|
4 小结
查询集 QuerySet
学习目标
1 概念
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
当调用如下过滤器方法时,返回查询集(而不是简单的列表):
- all():返回所有数据。
- filter():返回满足条件的数据。
- exclude():返回满足条件之外的数据。
- order_by():对结果进行排序。
注:文档类.objects也会返回包含所有数据的查询集
对查询集可以再次调用过滤器进行过滤,如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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项,运行查看。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| |
可以通过first()方法获取查询集中的第一个元素,如果查询集为空,则返回None
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| >>> BookInfo.objects.filter(btitle='雪山飞狐').first()
<BookInfo: 雪山飞狐>
>>> print(BookInfo.objects.filter(btitle='飞狐外传').first())
None
|
3 小结
- 查询集表示从数据库中获取的对象集合
- all、filter、exclude、order_by等返回查询集
- 可以对查询集进行取下标或切片操作
- 可以通过first()方法获取查询集中的第一个元素
页面管理后端开发
使用MongoEngine定义接口
学习目标
前面我们了解了MongoEngine的基本使用方法,接下来我们看一下如何使用MongoEngine结合django-rest-framework-mongoengine实现接口的定义
1 定义序列化器
要使用MongoEngine文档对象作为model,需要继承rest_framework_mongoengine.serializers的DocumentSerializer来完成序列化器的定义
定义序列化器
booktest/serializer.py:
```python
from rest_framework_mongoengi
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)