【Python使用】嘿马云课堂web完整实战项目第3篇:增加数据,修改数据【附代码文档】

教程总体简介:数据模型、模板管理、模板管理业务流程、模板制作、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()方法保存到数据库中。

>>> 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]
``
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容