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 相关文章推荐
Python  __getattr__与__setattr__使用方法
Sep 06 Python
python中将阿拉伯数字转换成中文的实现代码
May 19 Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
在Python中使用gRPC的方法示例
Aug 08 Python
对python借助百度云API对评论进行观点抽取的方法详解
Feb 21 Python
Django利用cookie保存用户登录信息的简单实现方法
May 27 Python
Python动态语言与鸭子类型详解
Jul 01 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 Python
python变量的作用域是什么
May 26 Python
Python第三方包PrettyTable安装及用法解析
Jul 08 Python
Python urllib3软件包的使用说明
Nov 18 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
php数组一对一替换实现代码
2012/08/31 PHP
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
详解vue中axios的封装
2018/07/18 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
python连接sql server乱码的解决方法
2013/01/28 Python
python实现列表的排序方法分享
2019/07/01 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
应届生船舶驾驶求职信
2013/10/19 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
运动会3000米加油稿
2015/07/21 职场文书
Selenium浏览器自动化如何上传文件
2022/04/06 Python
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android
MySQL存储过程及语法详解
2022/08/05 MySQL
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python