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脚本和ADB命令实现卸载App
Feb 10 Python
简单了解Python中的几种函数
Nov 03 Python
Python模拟随机游走图形效果示例
Feb 06 Python
django请求返回不同的类型图片json,xml,html的实例
May 22 Python
python实现猜数字小游戏
Mar 24 Python
python实现括号匹配的思路详解
Aug 23 Python
Python 日志logging模块用法简单示例
Oct 18 Python
python numpy数组中的复制知识解析
Feb 03 Python
Python多线程多进程实例对比解析
Mar 12 Python
Python根据指定文件生成XML的方法
Jun 29 Python
python 元组和列表的区别
Dec 30 Python
python中sys模块的介绍与实例
Apr 17 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 加密解密内部算法
2010/04/22 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
2012/03/14 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
jQuery实现全选、反选和不选功能
2017/08/16 jQuery
vue实现手机端省市区区域选择
2019/09/27 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
使用Flask集成bootstrap的方法
2018/07/24 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
技术人员面试提纲
2013/11/28 职场文书
建筑总经理岗位职责
2014/02/02 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
林肯就职演讲稿
2014/05/19 职场文书
植树造林的宣传标语
2014/06/23 职场文书
市场营销工作计划书
2014/09/15 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
小学班主任评语
2014/12/29 职场文书
小学生通知书评语
2014/12/31 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
教师节领导致辞
2015/07/29 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
详解Java实践之抽象工厂模式
2021/06/18 Java/Android