Django框架ORM数据库操作实例详解
作者:HMMHMH 发布时间:2024-01-24 00:23:33
本文实例讲述了Django框架ORM数据库操作。分享给大家供大家参考,具体如下:
测试数据:BookInfo表
PeopleInfo表
一.增加
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程序设计有所帮助。
来源:https://blog.csdn.net/zsh142537/article/details/83473118
猜你喜欢
- 一、算法概述AdaBoost 是英文 Adaptive Boosting(自适应增强)的缩写,由 Yoav Freund 和Robert S
- 学习前言……又看了很久的SSD算法,今天讲解一下训练部分的代码。预测部分的代码可以参照https
- 说在前面nodejs 读取数据库是一个异步操作,所以在数据库还未读取到数据之前,就会继续往下执行代码。最近写东西时,需要对数据库进行批量数据
- 目录概述语法定义接口实现接口空接口接口的组合总结概述Go 语言中的接口就是方法签名的集合,接口只有声明,没有实现,不包含变量。语法定义接口t
- 一个非常繁琐粗暴的方法,python属于入门级水平,就酱先备份一下,如果有更好的方法再更新arrs=[[2,15,48,4,5],[6,7,
- 使用 python manage.py createsuperuser创建超级用户时只能默认输入:用户名,邮箱,及密码来创建有的时候我们需要
- 本文实例为大家分享了opencv转换颜色空间更改图片背景的具体代码,供大家参考,具体内容如下思路:1、将BGR转换为HSV颜色空间 2、设置
- 我们在建立一个大型网站的时候会有很多副页面框架模式,甚至一些细节元素都是相同的。但令人困扰的是更新它们却要费些周折,要一遍遍地反复更新每个页
- 人一旦习惯了某些东西就很难去改,以及各种各样的原因,新的浏览器越来越多,而老的总淘汰不了。增长总是快于消亡导致了浏览器兼容是成了谈不完的话题
- isdecimal()方法检查字符串是否仅由十进制字符组成。此方法只存在于unicode对象。注意:要定义一个字符串为Unico
- 简单的并发控制利用 channel 的缓冲设定,我们就可以来实现并发的限制。我们只要在执行并发的同时,往一个带有缓冲的 chann
- pyquery的使用一、pyquery的介绍使用pyquery需要在Web和了解jQuery的基础上,使用该CSS选择器。二、pyquery
- tf.keras.layers模块中的函数from __future__ import print_function as _print_f
- 本文主要介绍了vue中的数据绑定原理的实现,分享给大家,也给自己留个笔记,具体如下:vue中的响应式数据绑定是通过数据劫持和观察者模式来实现
- 分页是每一个程序需要去理解的东西,学习过的几门语言中我发现分页原理都是一样的,下面为php初学者分析一下php分页实现与最后面补充了一个超级
- 最近在工作中进行了NLP的内容,使用的还是Keras中embedding的词嵌入来做的。Keras中embedding层做一下介绍。中文文档
- plotly 的 Python 软件包是一个开源的代码库,它基于 plot.js,而后者基于 d3.js。我们实际使用的则是一个对 plot
- 以下的文章主要向大家介绍的是实现MySQL远程访问的实际操作流程,以及在实现MySQL远程访问的过程中哪些的相关事项是十分重要的,以下就是文
- 这个python的小案例是五子棋游戏的实现,在这个案例中,我们可以实现五子棋游戏的两个玩家在指定的位置落子,画出落子后的棋盘,并且根据函数判
- MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认值为当前更新日期与时间的功能,你可以使用TIMESTAMP列类型下面