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插入排序算法实例分析
Jul 03 Python
python列表的增删改查实例代码
Jan 30 Python
Numpy数组转置的两种实现方法
Apr 17 Python
python读取文件名称生成list的方法
Apr 27 Python
对python创建及引用动态变量名的示例讲解
Nov 10 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
基于Python 中函数的 收集参数 机制
Dec 21 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 Python
python 基于Apscheduler实现定时任务
Dec 15 Python
Python Flask搭建yolov3目标检测系统详解流程
Nov 07 Python
python装饰器代码解析
Mar 23 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中的Session和Cookie
2013/06/21 PHP
PHP写日志的实现方法
2014/11/05 PHP
yii的CURD操作实例详解
2014/12/04 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
JS实现左右拖动改变内容显示区域大小的方法
2015/10/13 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
复制粘贴功能的Python程序
2008/04/04 Python
python 布尔操作实现代码
2013/03/23 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
利用python list完成最简单的DB连接池方法
2019/08/09 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
numba提升python运行速度的实例方法
2021/01/25 Python
python绘制高斯曲线
2021/02/19 Python
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技
微软团队与 NASA 科学家和惠普企业(HPE)的工程师合作
2022/04/21 数码科技