Django——模型层补充

django中如何开启事务

'''
# 事务的四大特性: # 简称: ACID# A: 原子性事务对数据的修改操作要么同时成功, 要么一个都别想成功(回滚)# C: 一致性事务的执行必然是从一个一致性的状态, 转变到另一个一致性的状态.# I: 隔离性对于并发的事务, 每个事务之间是互相隔离的, 互不影响的. 如果是争对同一份数据的修改操作, 那么将并发变成串行, 牺牲了效率, 但是保证了数据的安全.# D: 持久性:事务执行完毕对数据的修改操作是永久性的. 即便在数据库管理系统异常, 提交的结果对数据的修改也是永久的.# 原生SQL中的事务操作步骤1. 开启 start transaction;2. 回滚 rollback;3. 确认 commit;
'''from django.db import transaction
try:with transaction.atomic():# ORM执行SQL语句...# 在with代码快内书写的所有orm操作都是属于同一个事务
except Exception as e:print(e)print('执行其他操作')

orm语句的特点: 惰性查询

"""
如果你仅仅只是书写了orm语句 在后面根本没有用到该语句所查询出来的参数
那么orm会自动识别 直接不执行惰性: res = models.Book.objects.all()
执行: print(res)
"""

Django ORM执行原生SQL

'''
extra: 标识要做格外的操作
select={'publish_date': 'date_format(publish_date, "%%Y-%%m")'}: 执行原生的sql语句用到原生sql日期函数date_formatpublish_date: 定义一个key, 通过values后面可以拿到结果. 类始于annotate分组一样
'''
# 需求: 查询数据名称和出版时间(年-月)
res = models.Book.objects.extra(select={'publish_date': 'date_format(publish_date, "%%Y-%%m")'}).values('name', 'publish_date')
print(res)   # <QuerySet [{'publish_date': '2020-05', 'name': '西游记'}, {'publish_date': '2020-05', 'name': '水浒传'}]>

数据库查询优化

1. only 和 defer

'''
使用: 直接在objects后面连用
返回: only 和 defer都返回QuerySet对象
区别: only:  only括号内指定的字段,  在被查询的时候不会走数据库. defer: defer括号内指定的字段, 在被查询的时候会走数据库
特殊: 如果仅仅使用all. 没有执行结果它是惰性的, 但是一旦执行过一次. 第二次拿到all的返回值. 是不需要重新走数据库    
'''# 1. only
# res = models.Publish.objects.only('name')
res = models.Publish.objects.all()
print(res)      # <QuerySet [<Publish: 东方出版社>, <Publish: 北方出版社>]>
for i in res:print(i.name)  # 点击only括号内的字段不会走数据库for i in res:print(i.addr)  # 点击only括号内没有的字段会重新走数据库. 如果是all的情况就不需要走.
"""
(0.001) SELECT `app01_publish`.`id`, `app01_publish`.`addr` FROM `app01_publish` WHERE `app01_publish`.`id` = 1; args=(1,)
(0.001) SELECT `app01_publish`.`id`, `app01_publish`.`addr` FROM `app01_publish` WHERE `app01_publish`.`id` = 2; args=(2,)
"""# 2. defer
res = models.Publish.objects.defer('name')
print(res)  # <QuerySet [<Publish: 东方出版社>, <Publish: 北方出版社>]>for i in res:print(i.name)  # 点defer括号内的字段会走数据库
'''
(0.000) SELECT `app01_publish`.`id`, `app01_publish`.`name` FROM `app01_publish` WHERE `app01_publish`.`id` = 1; args=(1,)
(0.000) SELECT `app01_publish`.`id`, `app01_publish`.`name` FROM `app01_publish` WHERE `app01_publish`.`id` = 2; args=(2,)
'''for i in res:print(i.addr)  # 点defer括号内的字段不会走数据库

2. select_related 和 prefetch_related

'''
使用: 直接在objects后面连用
返回: only 和 defer都返回QuerySet对象
区别: select_related:   内部使用连表查询. !!注意:!! 括号内只能放外键字段. 且只支持一对一, 一对多的表关系. 多对多不支持.内部通过1次性将2表查询出来封装成对象中, 下次查询这2表就无序走数据库了.prefetch_related: 内部使用子查询.  内部通过2次性将子查询结果查询出封装成对象中.下次查询这2表就无序走数据库了. (感觉视角: 感觉是一次性搞定的) 
'''# 1. select_related 连表查询
'''
select_related内部直接先将Author与author_detail表连起来 然后一次性将大表里面的所有数据, 全部封装给查询出来的对象.
这个时候对象无论是点击book表的数据还是publish的数据都无需再走数据库查询了
'''
res = models.Author.objects.select_related('author_detail')
for i in res:print(i.author_detail.phone)
'''
(0.001) SELECT `app01_author`.`id`, `app01_author`.`name`, `app01_author`.`age`, `app01_author`.`author_detail_id`, `app01_authordetail`.`id`, `app01_authordetail`.`phone`, `app01_authordetail`.`addr` FROM `app01_author` INNER JOIN `app01_authordetail` ON (`app01_author`.`author_detail_id` = `app01_authordetail`.`id`); args=()
'''# 下次查询这2表就无序走数据库了.
for i in res:print(i.author_detail.phone) # prefetch_related 子查询 
'''
prefetch_related该方法内部其实就是子查询
将子查询查询出来的所有结果也给你封装到对象中
给你的感觉好像也是一次性搞定的
'''
res = models.Author.objects.prefetch_related('author_detail')
for i in res:print(i.author_detail.phone)  
'''
(0.000) SELECT `app01_author`.`id`, `app01_author`.`name`, `app01_author`.`age`, `app01_author`.`author_detail_id` FROM `app01_author`; args=()
(0.001) SELECT VERSION(); args=None
(0.000) SELECT `app01_authordetail`.`id`, `app01_authordetail`.`phone`, `app01_authordetail`.`addr` FROM `app01_authordetail` WHERE `app01_authordetail`.`id` IN (1, 2, 3); args=(1, 2, 3)
'''# 下次查询这2表就无序走数据库了.
for i in res:print(i.author_detail.phone)

in_bulk 根据主键ID进行查找

dic_obj = models.Book.objects.in_bulk([1, 2])
print(type(dic_obj))  # <class 'dict'>
for pk, book_obj in dic_obj.items():print(pk, book_obj.name)'''
1 西游记
2 水浒传
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/146454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何防止图片抖动

如何防止图片抖动 什么是图片抖动&#xff0c;就是我们加载图片完成之后&#xff0c;图片显示&#xff0c;但是其下方内容会跟着下移&#xff0c;这就造成了图片抖动用户体验不好&#xff0c;我们想即使图片没加载出来&#xff0c;页面上也有一个空白的位置留给图片。 我们要知…

【观察】华为:数智世界“一触即达”,应对数智化转型“千变万化”

毫无疑问&#xff0c;数智化既是这个时代前进所趋&#xff0c;也是国家战略所指&#xff0c;更是所有企业未来发展进程中达成的高度共识。 但也要看到&#xff0c;由于大量新兴技术的出现&#xff0c;技术热点不停的轮转&#xff0c;加上市场环境的快速变化&#xff0c;让数智化…

Nacos 配置中心底层原理(1.X版本)

前言 Nacos 1.X版本 是长轮询 Nacos 2.X版本 是GRPC 长轮询 概念 客户端会轮询向服务端发出一个长连接请求&#xff0c;这个长连接最多30s就会超时&#xff0c;服务端收到客户端的请求会先判断当前是否有配置更新&#xff0c;有则立即返回&#xff0c;如果没有服务端会将这个…

upload-labs关卡9(基于win特性data流绕过)通关思路

文章目录 前言一、靶场需要了解的知识1::$data是什么 二、靶场第九关通关思路1、看源码2、bp抓包修改后缀名3、检查是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授…

【cpolar】Ubuntu本地快速搭建web小游戏网站,公网用户远程访问

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;cpolar&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 目录 前言 1. 本地环境服务搭建 2. 局域网测试访问 3. 内网穿透 3.1 ubuntu本地安装cpolar 3.2 创建隧道 3.3 测试公网访问 4. 配置…

Netty Review - 从BIO到NIO的进化推演

文章目录 BIODEMO 1DEMO 2小结论单线程BIO的缺陷BIO如何处理并发多线程BIO服务器的弊端 NIONIO要解决的问题模拟NIO方案一&#xff1a; &#xff08;等待连接时和等待数据时不阻塞&#xff09;方案二&#xff08;缓存Socket&#xff0c;轮询数据是否准备好&#xff09;方案二存…

Pyrthon中pandas DataFrame对表格数据选取,修改,切片的实现

set_index()函数 在Python Pandas的数据处理中&#xff0c;set_index是一个非常常用的函数&#xff0c;它的作用就是将DataFrame中的一列或多列作为新的索引。使用set_index函数&#xff0c;可以快速地进行数据的筛选和重组。 如何在pandas中使用set_index( )与reset_index( )…

医院数字化LIS(检验信息系统)源码

临床检验信息管理系统&#xff08;LIS&#xff09;是利用计算机连接医疗设备&#xff0c;通过计算机信息处理技术&#xff0c;将医院检验科或实验室的临床检验数据进行自动收集、存储、处理、提取、传输和交换&#xff0c;满足所有授权用户的功能需求。 一、系统概述 1.LIS&am…

Redis篇---第五篇

系列文章目录 文章目录 系列文章目录前言一、持久化有两种,那应该怎么选择呢?二、怎么使用 Redis 实现消息队列?三、说说你对Redis事务的理解前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,…

自定义ES分词器

1 分词器的组成 ES的分词器主要由三部分组成&#xff1a; &#xff08;1&#xff09;原始文本处理-charactor filters 对原始文本进行处理。 &#xff08;2&#xff09;切词-tokenizer 按照规则进行切词。 &#xff08;3&#xff09;单词处理-token filters 将切词获取的…

Axure基础详解二十二:随机点名效果

效果演示 组件 建立一个【中继器】&#xff0c;内部插入一个“文本框”。【中继器】每页项目数为1&#xff0c;开始页为1。 设置交互 页面载入时交互 给【中继器】新曾行&#xff0c;“name”数据列添加10行数据&#xff0c;填入相应的名字&#xff1b;“shunxu”数据列全部…

C#与c++对应的类型 转载

//C#调用C++的DLL搜集整理的所有数据类型转换方式-转载 //c++:HANDLE(void *) ---- c#:System.IntPtr //c++:Byte(unsigned char) ---- c#:System.Byte //c++:SHORT(short) ---- c#:System.Int16 //c++:WORD(unsigned short) ---- c#:System.UInt16 //c++:INT(int) ---- c#:Sys…

黑马程序员微服务 分布式搜索引擎3

分布式搜索引擎03 0.学习目标 1.数据聚合 **聚合&#xff08;aggregations&#xff09;**可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f;这些手机的平均价格、最高价格、最低价格&#xff1f;这些手机每月的销售…

vue3.0中实现excel文件的预览

最近开发了一个需求&#xff0c;要求实现预览图片、pdf、excel、word、txt等格式的文件&#xff1b; 每种格式的文件想要实现预览的效果需要使用对应的插件&#xff0c;如果要实现excel格式文件的预览&#xff0c;要用到哪种插件呢&#xff1f; 答案&#xff1a;xlsx.full.min…

Java项目实战《苍穹外卖》 一、项目概述

人道洛阳花似锦&#xff0c;偏我来时不逢春。 系列文章目录 苍穹外卖是黑马程序员2023年的Java实战项目&#xff0c;作为业余练手用&#xff0c;需要源码或者课程的可以找我&#xff0c;无偿分享 Java项目实战《苍穹外卖》 一、项目概述Java项目实战《苍穹外卖》 二、项目搭建 …

计算机硬件组成部分

目录 中央处理器 控制器 运算器 存储器 输入输出设备 总线 硬件通常是指构成计算机的设备实体。一台计算机的硬件系统应由五个基本部分组成&#xff1a;运算器、控制器、存储器、输入和输出设备。现代计算机还包括中央处理器和总线设备。这五大部分通过系统总线完成指令所…

电子学会2023年06月青少年软件编程(图形化)等级考试试卷(一级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(一级) 一、单选题(共25题,共50分) 1. 看图找规律,请问下图红框中是?( ) A.

install YAPI MongoDB 备份mongo 安装yapi插件cross-request 笔记

登录容器 docker exec -it mongodb bash 登录mongo mongo -u root -p 123456 查看db show dbs 查看collection show collections 进入db use yapi 查看数据 db.<collection_name>.find() 带条件查看 db.<collection_name>.find({ <field>: <value>…

git使用patch进行补丁操作

文章目录 前言一、format-patch/am生成和应用补丁1、生成2、应用 二、patch文件解读 前言 在软件开发中&#xff0c;代码协作和版本管理是至关重要的。Git 是一个流行的分布式版本控制系统&#xff0c;它提供了各种功能来简化团队合作和代码管理。但是如何给已有项目打补丁&am…

Kafka学习笔记(三)

目录 第5章 Kafka监控&#xff08;Kafka Eagle&#xff09;5.2 修改kafka启动命令5.2 上传压缩包5.3 解压到本地5.4 进入刚才解压的目录5.5 将kafka-eagle-web-1.3.7-bin.tar.gz解压至/opt/module5.6 修改名称5.7 给启动文件执行权限5.8 修改配置文件5.9 添加环境变量5.10 启动…