Django框架ORM数据库操作实例详解


Posted in Python onNovember 07, 2019

本文实例讲述了Django框架ORM数据库操作。分享给大家供大家参考,具体如下:

测试数据:BookInfo表

Django框架ORM数据库操作实例详解

PeopleInfo表

Django框架ORM数据库操作实例详解

一.增加

1.save:

对象 = 模型类(
字段名 = 值,
字段名 = 值,
…
)

对象.save()

例:

>>> book = BookInfo(
...     name='python入门',
...     pub_date='2010-1-1'
...   )
>>> book.save()
>>> book
<BookInfo: python入门>

2.create:

模型类.objects.create(
字段名 = 值,
字段名 = 值,
…
)

例:

>>> PeopleInfo.objects.create(
...     name='itheima',
...     book=book
...   )
<PeopleInfo: itheima>

二.删除

1.模型类对象delete:

对象 = 模型类.objects.get(条件)
对象.delete()

例:

>>> person = PeopleInfo.objects.get(name='传智播客')
>>> person.delete()
(1, {'book.PeopleInfo': 1})

2.模型类.objects.filter().delete():

模型类.objects.filter(条件).delete()

例:

>>> BookInfo.objects.filter(name='python入门').delete()
(1, {'book.BookInfo': 1, 'book.PeopleInfo': 0})

三.修改

1.save:

对象 = 模型类.objects.get(条件)
对象.属性 = 值
对象.save()

例:

>>> person = PeopleInfo.objects.get(name='itheima')
>>> person.name = 'itcast'
>>> person.save()
>>> person
<PeopleInfo: itcast>

2.update:

模型类.objects.filter(条件).update(属性=值) (返回的是受影响的行数)

例:

>>> PeopleInfo.objects.filter(name='itcast').update(name='传智播客')

四.查询

1.基本查询

get:查询单一结果,不存在会抛出DoesNotExist异常。(查询结果不是1个也会报错)
all:查询多个结果。
count:查询结果数量。

用法:模型类.objects.get/all/count()

2.过滤查询

filter:过滤出多个结果
exclude:排除掉符合条件剩下的结果
get:过滤出单一结果

3.过滤条件语法

用法:属性名称__比较运算符 = 值
exact:相等

例:查询编号为1的图书。

BookInfo.objects.filter(id__exact=1)

可简写为:

BookInfo.objects.filter(id=1)

contains:包含

例:查询书名包含'传'的图书。

BookInfo.objects.filter(name__contains='传')
<QuerySet [<BookInfo: 射雕英雄传>]>

startswith/endswith:以指定值开头/结尾

例:查询书名以'部'结尾的图书

>>> BookInfo.objects.filter(name__endswith='部')
<QuerySet [<BookInfo: 天龙八部>]>

isnull:是否为空

例:查询书名为空的图书。

>>> BookInfo.objects.filter(name__isnull=True)
<QuerySet []>

in:是否包含在范围内

例:查询编号为1或3或5的图书

>>> BookInfo.objects.filter(id__in=[1,3,5])
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 笑傲江湖>]>

gt/gte/lt/lte:比较查询,分别为大于,大于等于,小于,小于等于

例:查询编号大于3的图书

>>> BookInfo.objects.filter(id__gt=3)
<QuerySet [<BookInfo: 雪山飞狐>]>

year/month/day/week_day/hour/minute/second:时间日期

例:查询1980年发表的图书。

>>> BookInfo.objects.filter(pub_date__year=1980)
<QuerySet [<BookInfo: 射雕英雄传>]>

4.F对象和Q对象

F对象:用来比较两个属性(使用前需要导入)
用法:F(属性名)
例:查询阅读量大于等于评论量的图书。

>>> from django.db.models import F
>>> BookInfo.objects.filter(readcount__gt=F('commentcount'))
<QuerySet [<BookInfo: 雪山飞狐>]>

Q对象:实现逻辑或or的查询
用法:Q(属性名__运算符=值),也可在前面加~表示not
例:查询阅读量大于20,或编号小于3的图书

>>> BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>]>

5.聚合函数

聚合函数:可使用aggregate()过滤器调用聚合函数(Avg,Count,Max,Min,Sum)
用法:模型类.objects.aggregate(聚合函数(字段名))
例:查询图书的总阅读量。

>>> from django.db.models import Sum
>>> BookInfo.objects.aggregate(Sum('readcount'))
{'readcount__sum': 126}

返回值为字典类型:{'属性名__聚合类小写':值}

注意:使用count一般不用使用过滤器

例:查询图书总数。

BookInfo.objects.count()

返回值为一个数字

6.排序函数

用法:模型类.objects.all().order_by(属性名)
默认升序排序,属性名前加-为降序
例:

# 默认升序
>>> BookInfo.objects.all().order_by('readcount')
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 笑傲江湖>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>]>
# 降序
>>> BookInfo.objects.all().order_by('-readcount')
<QuerySet [<BookInfo: 雪山飞狐>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 射雕英雄传>]>

7.关联查询

一到多的访问:

用法:一对应的模型类对象.多对应的模型类名小写_set
例:查询id为1的书籍人物

>>> book = BookInfo.objects.get(id=1)
>>> book.peopleinfo_set.all()
<QuerySet [<PeopleInfo: 郭靖>, <PeopleInfo: 黄蓉>, <PeopleInfo: 黄药师>, <PeopleInfo: 欧阳锋>, <PeopleInfo: 梅超风>]>

多到一的访问:

用法:多对应的模型类对象.多对应的模型类中的关系类.属性名
例:查询id为1的人物的书籍

>>> person = PeopleInfo.objects.get(id=1)
>>> person.book.name
‘射雕英雄传'

关联过滤查询:

用法:关联模型类名小写__属性名__条件运算符=值
例:查询图书,要求图书中人物的描述包含"八"

>>> book = BookInfo.objects.filter(peopleinfo__description__contains='八')
>>> book
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>]>

查询图书阅读量大于30的所有人物

>>> people = PeopleInfo.objects.filter(book__readcount__gt=30)
>>> people
<QuerySet [<PeopleInfo: 乔峰>, <PeopleInfo: 段誉>, <PeopleInfo: 虚竹>, <PeopleInfo: 王语嫣>, <PeopleInfo: 胡斐>, <PeopleInfo: 苗若兰>, <PeopleInfo: 程灵素>, <PeopleInfo: 袁紫衣>]>

希望本文所述对大家基于Django的Python程序设计有所帮助。

Python 相关文章推荐
python2.7的编码问题与解决方法
Oct 04 Python
使用Python脚本和ADB命令实现卸载App
Feb 10 Python
Python实现的多进程和多线程功能示例
May 29 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
django中瀑布流写法实例代码
Oct 14 Python
基于Python数据结构之递归与回溯搜索
Feb 26 Python
通过代码实例了解Python3编程技巧
Oct 13 Python
Python基础之hashlib模块详解
May 06 Python
python游戏开发Pygame框架
Apr 22 Python
Python程序暂停的正常处理方法
Nov 07 #Python
浅析python redis的连接及相关操作
Nov 07 #Python
大家都说好用的Python命令行库click的使用
Nov 07 #Python
flask 实现token机制的示例代码
Nov 07 #Python
python3反转字符串的3种方法(小结)
Nov 07 #Python
Python中__repr__和__str__区别详解
Nov 07 #Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 #Python
You might like
PHP4(windows版本)中的COM函数
2006/10/09 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
Jquery网页出现的乱码问题的三种解决方法
2013/06/30 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
javascript实现拖动元素交换位置
2015/11/29 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Javascript中字符串和数字的操作方法整理
2017/01/22 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
ES6 十大特性简介
2020/12/09 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
Python自动重试HTTP连接装饰器
2015/04/28 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
安踏官方商城:anta.cn
2019/12/16 全球购物
蔻驰英国官网:COACH英国
2020/07/19 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
夜大毕业生自我鉴定
2013/10/31 职场文书
出纳岗位职责模板
2013/11/27 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
迎国庆横幅标语
2014/10/08 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
JS数组方法some、every和find的使用详情
2021/10/05 Javascript
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS