数据库操作—增、删、改、查

一、 增加

增加数据有两种方法。

1)save

通过创建模型类对象,执行对象的save()方法保存到数据库中。

>>> from datetime import date
>>> book = BookInfo(btitle='西游记',bput_date=date(1988,1,1),bread=10,bcomment=10
)
>>> book.save()
>>> hero = HeroInfo(hname='孙悟空',hgender=0,hbook=book
)
>>> hero.save()
>>> hero2 = HeroInfo(hname='猪八戒',hgender=0,hbook_id=book.id
)
>>> hero2.save()

2)create

通过模型类.objects.create()保存。

>>> HeroInfo.objects.create(
hname='沙悟净',
hgender=0,
hbook=book
)
<HeroInfo: 沙悟净>
创建对象 create(), bulk_create(), update_or_create() 创建,批量创建,创建或更新

二、修改

修改更新有两种方法

1)save

修改模型类对象的属性,然后执行save()方法

hero = HeroInfo.objects.get(hname='猪八戒')
hero.hname = '猪悟能'
hero.save()

2)update

使用模型类.objects.filter().update(),会返回受影响的行数

HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
更新对象 update(), update_or_create() 更新,更新或创建

三、查询

3.1 基本查询

get 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。

all 查询多个结果。

count 查询结果数量。

>>> BookInfo.objects.all()
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>, <BookInfo: 西游记>]>
>>> book = BookInfo.objects.get(btitle='西游记')
>>> book.id
5>>> BookInfo.objects.get(id=3)
<BookInfo: 笑傲江湖>
>>> BookInfo.objects.get(pk=3)
<BookInfo: 笑傲江湖>
>>> BookInfo.objects.get(id=100)
Traceback (most recent call last):File "<console>", line 1, in <module>File "/Users/delron/.virtualenv/dj/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_methodreturn getattr(self.get_queryset(), name)(*args, **kwargs)File "/Users/delron/.virtualenv/dj/lib/python3.6/site-packages/django/db/models/query.py", line 380, in getself.model._meta.object_name
db.models.DoesNotExist: BookInfo matching query does not exist.>>> BookInfo.objects.count()
6

3.2 过滤查询

实现SQL中的where功能,包括

  • filter 过滤出多个结果
  • exclude 排除掉符合条件剩下的结果
  • get 过滤单一结果

对于过滤条件的使用,上述三个方法相同,故仅以filter进行讲解。
过滤条件的表达语法如下:

属性名称__比较运算符=值
# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线

1)相等

exact:表示判等。

exact:精确匹配,区分大小写。iexact:不区分大小写的精确匹配

例:查询编号为1的图书。

BookInfo.objects.filter(id__exact=1)
可简写为:
BookInfo.objects.filter(id=1)

2)模糊查询

contains:是否包含。

说明:如果要包含%无需转义,直接写即可。

例:查询书名包含’传’的图书。

BookInfo.objects.filter(btitle__contains='传')

startswith、endswith:以指定值开头或结尾。

例:查询书名以’部’结尾的图书

BookInfo.objects.filter(btitle__endswith='部')
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.

3) 空查询

isnull:是否为null。

例:查询书名不为空的图书。

BookInfo.objects.filter(btitle__isnull=False)

4) 范围查询

in:是否包含在范围内。

例:查询编号为1或3或5的图书

BookInfo.objects.filter(id__in=[1, 3, 5])

5)比较查询

  • gt 大于 (greater then)
  • gte 大于等于 (greater then equal)
  • lt 小于 (less then)
  • lte 小于等于 (less then equal)

例:查询编号大于3的图书

BookInfo.objects.filter(id__gt=3)

不等于的运算符,使用exclude()过滤器。

例:查询编号不等于3的图书

BookInfo.objects.exclude(id=3)
Student.objects.all().exclude(nickname='A同学')

6)逆序

reverse() 方法反向排序QuerySet中返回的元素。第二次调用reverse()将恢复到原有的排序。

Student.objects.all().reverse()

7)查询某字段有多少种类的值

distinct 返回一个在SQL 查询中使用SELECT DISTINCT的新QuerySet。它将去除查询结果中重复的行。

Student.objects.all().distinct()

8)惰性操作

orm内所有的语句操作,都是惰性操作:只会在你真正需要数据的时候才会走数据库,如果你单单只写orm语句是不会走数据库的。这样设计的好处在于减轻数据库的压力。

res = models.Book.objects.values('title')   #普通查询方式 获取到的结果是列表套字典
res1 = models.Book.objects.only('title')   #结果是一个个对象,可以直接点属性获取到属性值
print(res)
print(res1)

only和普通查询的不同就是能直接获取到对象,除了可以获取到上面的title属性值,还可以获取到该对象其他的属性值。但是也有优缺点,看下面的例子。

res1 = models.Book.objects.only('title')
for r in res1:print(r.title)  #只走一次数据库查询print(r.price)  #每取一次数据就走数据库一次
only总结:当你获取一个不是only括号内指定的字段的时候,不会报错,而是会频繁的走数据库查询

defer与only是相反的

res1 = models.Book.objects.defer('title')for r in res1:print(r.price)  #不是括号内的字段,只走一次数据库查询
defer总结:defer会将不是括号内的所有的字段信息全部查询出来封装到对象中,一旦你查了了括号内的字段,那么会频繁的走数据库查询

9) union(), intersection(), difference() 并集、交集、差集

p_240 = Course.objects.filter(price__gte=240)
p_260 = Course.objects.filter(price__lte=260)
print(p_240.union(p_260))
print(p_240.intersection(p_260))
print(p_240.difference(p_260))

values

返回一个ValuesQuerySet ——QuerySet 的一个子类,迭代时返回字典而不是模型实例对象。
例如:

>>> Blog.objects.filter(name__startswith='Beatles').values()[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]

values_list()

返回一个ValuesQuerySet ——QuerySet 的一个子类,迭代时返回元组而不是模型实例对象。

6)日期查询

year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。

例:查询1980年发表的图书。

BookInfo.objects.filter(bpub_date__year=1980)

例:查询1980年1月1日后发表的图书。

BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))

7)查询某个字段所有值得种类

模型.objects.filter(...). values_list("字段名", flat=True). distinct(). order_by("字段名")

F对象

之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。

语法如下:

F(属性名)

例:查询阅读量大于等于评论量的图书。

from django.db.models import FBookInfo.objects.filter(bread__gte=F('bcomment'))

可以在F对象上使用算数运算。

例:查询阅读量大于2倍评论量的图书。

BookInfo.objects.filter(bread__gt=F('bcomment') * 2)

Q对象

多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。

例:查询阅读量大于20,并且编号小于3的图书。

BookInfo.objects.filter(bread__gt=20,id__lt=3)
或
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)

如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。

语法如下:

Q(属性名__运算符=值)

例:查询阅读量大于20的图书,改写为Q对象如下。

from django.db.models import QBookInfo.objects.filter(Q(bread__gt=20))

Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。

例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现

BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))

Q对象前可以使用~操作符,表示非not。

例:查询编号不等于3的图书。

BookInfo.objects.filter(~Q(pk=3))

聚合函数

使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。

例:查询图书的总阅读量。

from django.db.models import SumBookInfo.objects.aggregate(Sum('bread'))

注意aggregate的返回值是一个字典类型,格式如下:

  {'属性名__聚合类小写':值}如:{'bread__sum':3}

使用count时一般不使用aggregate()过滤器。

例:查询图书总数。

BookInfo.objects.count()

注意count函数的返回值是一个数字。

annotate() 使用聚合计数、求和、平均数 raw() 执行原生的SQL

print(Course.objects.values('teacher').annotate(vol=Sum('volume')))
print(Course.objects.values('teacher').annotate(pri=Avg('price')))

3.3 排序

使用order_by对结果进行排序

BookInfo.objects.all().order_by('bread')  # 升序
BookInfo.objects.all().order_by('-bread')  # 降序

3.4 关联查询

由一到多的访问语法:

一对应的模型类对象.多对应的模型类名小写_set 例:

b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()

由多到一的访问语法:

多对应的模型类对象.多对应的模型类中的关系类属性名 例:

h = HeroInfo.objects.get(id=1)
h.hbook

访问一一对应的模型类关联对象的id语法:

多对应的模型类对象.关联类属性_id

例:

h = HeroInfo.objects.get(id=1)
h.hbook_id

关联过滤查询

由多模型类条件查询一模型类数据:

语法如下:

关联模型类名小写__属性名__条件运算符=值
注意:如果没有"__运算符"部分,表示等于。

例:

查询图书,要求图书英雄为"孙悟空"

BookInfo.objects.filter(heroinfo__hname='孙悟空')

查询图书,要求图书中英雄的描述包含"八"

BookInfo.objects.filter(heroinfo__hcomment__contains='八')

由一模型类条件查询多模型类数据:

语法如下:

一模型类关联属性名__一模型类属性名__条件运算符=值

注意:如果没有"__运算符"部分,表示等于。

例:

查询书名为“天龙八部”的所有英雄。

HeroInfo.objects.filter(hbook__btitle='天龙八部')

查询图书阅读量大于30的所有英雄

HeroInfo.objects.filter(hbook__bread__gt=30)

连表操作之使用函数:select_related与prefetch_related

select_related帮你直接连表操作,查询数据,括号内只能放外键字段
res1 = models.Book.objects.select_related('publish')   #连接book表和publish表
for r in res1:print(r.publish.name)

总结:select_related:会将括号内的外键字段所关联的那张表直接全部拿过来(也可以一次性拿多张表)跟当前表拼接操作,从而降低你跨表查询,数据库的压力。

注意:select_related括号内只能放外键字段(一对一和一对多)

res = models.Book.objects.all().select_related('外键字段1__外键字段2__外键字段3__外键字段4')
prefetch_related不主动连表
res2 = models.Book.objects.prefetch_related('publish')
for r in res2:print(r.publish.name)

不主动连表操作(但是内部给你的感觉像是连表操作了)而是将book表中的publish全部拿出来,再取publish表中将id对应的所有的数据取出,括号内有几个外键字段,就会走几次数据库查询操作。

其他函数

first(), last(), latest(), earliest() 第一个、最后一个、最新一个、最早一个

四、 删除

删除有两种方法

1)模型类对象delete

hero = HeroInfo.objects.get(id=13)
hero.delete()

2)模型类.objects.filter().delete()

HeroInfo.objects.filter(id=14).delete()

五、事务

ACID

原子性、一致性、隔离性、持久性

from django.db import transactionwith transaction.atomic():"""数据库操作在该代码块中书写的操作 同属于一个事务"""models.Book.objects.create()models.Publish.objects.create()# 添加书籍和出版社 就是同一个事务 要么一起成功要么一起失败
print('出了 代码块 事务就结束')

django模型使用操作相关推荐

  1. python Django 模型操作

    python Django 模型操作 1. 添加模型到数据库 2. objects:查找数据 3. all:查找所有数据 4. filter:数据过滤 5. get:获取单个对象 6. order_b ...

  2. Django项目实践3 - Django模型(字段、数据库操作及模型继承)

    http://blog.csdn.net/pipisorry/article/details/45725953 Django数据库字段类型(Field types) AutoField class A ...

  3. Django基础五之Django模型层(二)多表操作

    Django基础五之Django模型层(二)多表操作 一 创建模型 表和表之间的关系 一对一.多对一.多对多 # 作者表 比较常用的信息放在这个表中 class Author(models.Model ...

  4. Django工程-ORM模型数据库操作详解(六)

    Django工程-ORM模型数据库操作 下面以用户和图书表模型进行ORM的基本操作使用 ORM模型介绍 1.增加 通过模型类.objects.create()保存. >>> User ...

  5. 4Python全栈之路系列之Django模型

    Python全栈之路系列之Django模型 MTV开发模式 把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的Model-View-Controller(MVC)模式.在这个模式中 ...

  6. Web开发-Django模型层

    Django模型层 简述 Django框架处理业务的逻辑一般如下(省略图,源于网络,侵删) 可以看到,Django自带了一套ORM机制,这也是Django框架的核心-"全面",将一 ...

  7. Django模型(三)

    Django模型(三) 文章目录 Django模型(三) 一.模型类关系 1.关系字段类型 2.一对多关系 3.多对多关系 二.关联查询 1.通过对象执行关联查询 2.通过模型类执行关联查询 三.自关 ...

  8. Django模型(二)

    Django模型(二) 文章目录 Django模型(二) 一.字段查询 1.查看mysql数据库日志 二.条件运算符 1.查询等 2.模糊查询 3.空查询 4. 范围查询 5. 比较查询 6).日期查 ...

  9. Django模型(一)

    Django模型(一) 文章目录 Django模型(一) 一.配置Django使用mysql数据库 二.案例 1.定义模型类 2.打开booktest/models.py文件 3.迁移 4.测试数据 ...

最新文章

  1. Android横竖屏切换View设置不同尺寸或等比例缩放的自定义View的onMeasure解决方案(2)...
  2. hdu-1862-EXCEL排序
  3. [POJ3096]Surprising Strings
  4. ngRoute+ngAnimate与JQM中的页面跳转的区别
  5. 工作流分支走向流线条件配置
  6. 毕业5年决定你的一生
  7. 关于重装Win10系统卡死在PIN码设置步骤
  8. 计算机科学终审多长时间,一些计算机科学核心期刊的投稿经验
  9. ffmpeg视频剪切与拼接
  10. java程序步骤_java编写程序的步骤是什么?java编写程序步骤实例讲解
  11. Playcanvas动画格式解析
  12. java多线程设计模式详解
  13. linux bazel 源码,ubuntu 18.04编译安装bazel
  14. ​趣约会接入珍爱网风控系统,安全成婚恋交友“护城河”
  15. 为什么说Java中只有值传递
  16. 网络营销实战课-笔记4
  17. 雷达有源干扰——噪声卷积干扰
  18. win to go WTG 安装win系统到移动硬盘 移动办公 linux to go deepin to go
  19. 高性能MySQL(3th)(第六章 sql优化) —— 01 减少冗余数据
  20. partial least squares regresssion (PLSR)偏最小二乘

热门文章

  1. 卸载Android系统中自带的应用
  2. 【转】如何更好的进行项目文档管理
  3. Matlab开发独立部署的应用程序及matlab编程纪要
  4. 【医学图像处理】1 (医学)图像及图像处理流程
  5. PAT --- 1041.考试座位号 (15 分)
  6. Cosmos 基础 -- Ignite CLI(一)
  7. 实现NRF24L01自动对频功能
  8. 浅谈项目管理之平衡原则
  9. OpenCV----MonoDepthv2单目深度估计ONNX推理
  10. Ethernet 报文