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根据路径导入模块的方法
Sep 30 Python
python字符串的常用操作方法小结
May 21 Python
利用Python实现网络测试的脚本分享
May 26 Python
SVM基本概念及Python实现代码
Dec 27 Python
Python数字图像处理之霍夫线变换实现详解
Jan 12 Python
python模块之paramiko实例代码
Jan 31 Python
Python subprocess模块功能与常见用法实例详解
Jun 28 Python
python训练数据时打乱训练数据与标签的两种方法小结
Nov 08 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
Apr 08 Python
python3中数组逆序输出方法
Dec 01 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字符串 ==比较运算符的副作用
2009/10/21 PHP
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
解析PHP无限级分类方法及代码
2013/06/21 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
jquery插件NProgress.js制作网页加载进度条
2015/06/05 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
详解flask表单提交的两种方式
2018/07/21 Python
Python实现繁?转为简体的方法示例
2018/12/18 Python
python中实现栈的三种方法
2020/12/19 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
工作时间上网检讨书
2014/02/03 职场文书
写求职信有哪些注意事项
2014/05/08 职场文书
导师就业推荐信范文
2014/05/22 职场文书
关于教师节的广播稿
2014/09/10 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
出生证明范本
2015/06/15 职场文书
高中体育课教学反思
2016/02/16 职场文书
Golang 实现超大文件读取的两种方法
2021/04/27 Golang