day09 orm查询优化相关

今日内容概要

  • orm字段相关补充
  • orm查询优化相关
  • orm事务操作
  • 图书管理系统练习

今日内容详细

orm事务操作

"""
事务:ACID
A原子性
C一致性
I独立性
D持久性
start transaction
...
rollback
commit
"""
from django.db import transaction
# 事务
# 买一本 跟jason学Linux 书
# 在数据库层面要做的事儿
# 1. 创建一条订单数据
# 2. 去产品表 将卖出数+1, 库存数-1
from django.db.models import F
# 开启事务处理
try:
with transaction.atomic():
# 创建一条订单数据
models.Book.objects.create(num="110110111", product_id=1, count=1)
# 能执行成功
models.Book.objects.filter(id=1).update(kucun=F("kucun") - 1, maichu=F("maichu") + 1)
except Exception as e:
print(e)
transaction.rollback() # 回滚
transaction.commit() # 提交

orm常用字段

# verbose_name  中文标识
AutoField() # 专门用于主键
"""需要指定primary key参数"""
CharField()
"""需要指定max_length参数 varchar()"""
IntegerField() # 整形
DecimalField() # 浮点型
DateField()
DateTimeField()
"""
auto_now 每次更新数据记录的时候会更新该字段
auto_now_add 创建数据记录的时候会把当前时间添加到数据库
"""
BooleanField() # 布尔值类型
"""
传布尔值 存0或1
is_delete = models.BooleanField()
is_alive = models.BooleanField()
is_buy = models.BooleanField()
"""
TextField() # 文本类型
"""
专门用于存储大段文本数据
比如文章内容...
"""
EmailField() # 邮箱类型
FileField()
- 字符串,路径保存在数据库,文件上传到指定目录
- upload_to = "" 上传文件的保存路径
DecimalField(Field)
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度 """自定义字段:为了防止django版本与最新的数据库产生差异"""
class MyCharField(models.Field):
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
super().__init__(max_length=max_length, *args, **kwargs) def db_type(self, connection):
return 'char(%s)' % self.max_length # 重要参数
null = True
default = None
unique 如果设置为unique=True 则该字段在此表中必须是唯一的 。
db_index 如果db_index=True 则代表着为此字段设置索引。
# 外键字段
to、to_field、on_delete、related_name(给外键字段起别名 用于正反向)
db_constraint
"""自行总结django1.X与django2.X|3.X外键字段使用的区别"""

orm查询优化

only与defer
select_related与prefetch_related 1、在ORM语句中 默认所有的查询都是惰性查询
res = models.Book.objects.all()
res1 = models.Book.objects.filter(pk=1) 2、only与defer
获取指定字段对应的数据 并且封装成字典
res = models.Book.objects.values('title')
for d in res:
print(d,type(d))
print(d.get('title'))
获取指定字段对应的数据 并且封装成对象
res = models.Book.objects.only('title')
for obj in res:
print(obj.title)
print(obj.price)
print(obj.publish_time)
"""
对象点击only括号内填写的字段名称不会再走数据库查询
但是点击括号内不存在的字段名称则每次都会走数据库查询
""" # defer
res = models.Book.objects.defer('title')
for obj in res:
print(obj.price)
"""
对象点击defer括号内填写的字段名称会再走数据库查询
但是点击括号内不存在的字段名称则每次都不会走数据库查询
""" select_related
res = models.Book.objects.filter(pk=3).first()
print(res.publish.name)
"""select_related括号内只能放外键字段 并且不支持多对多外键字段""" 3、select_related
res = models.Book.objects.select_related('publish') # 走一次数据库查询
for obj in res:
print(obj.publish.name)
"""
内部是连表操作 会将外键关联的表与当前表拼接 之后将所有的数据全部封装到数据对象中
之后对象无论查询哪个表的数据都不再走数据库查询,不能放多对多 """ 4、prefetch_related
res = models.Book.objects.prefetch_related('publish') # 走两条数据库查询
for obj in res:
print(obj.publish.name)
"""
内部是子查询操作 先查询所有的书籍数据 之后查询每本书籍数据对应的出版社数据
之后将总数据封装到数据对象中
"""

图书管理系统

表:四张表
功能:只需要实现图书的增删改查即可
界面:使用bootstrap框架
知识点:路由层 视图层 模板层 模型层全部 """写项目的基本流程 永远都是从数据库设计开始""" # 首页
url(r'^$', views.home,name='hm'),
# 图书展示
url(r'^book_list/', views.book_list, name='bl'),
# 图书添加
url(r'^book_add/', views.book_add, name='ba') def home(request):
return render(request, 'home.html') def book_list(request):
book_queryset = models.Book.objects.all()
return render(request, 'book_list.html', locals()) def book_add(request):
if request.method == 'POST':
# 获取用户上传的图书数据
title = request.POST.get('title')
price = request.POST.get('price')
publish_time = request.POST.get('publish_time')
publish_pk = request.POST.get('publish_pk')
authors_pk_list = request.POST.getlist('authors_pk_list')
'''涉及到数据的校验 暂时都不考虑 后面有现成的组件可以完成'''
book_obj = models.Book.objects.create(title=title, price=price, publish_time=publish_time, publish_id=publish_pk)
book_obj.authors.add(*authors_pk_list) # getlist获取到的是列表 而add方法只能传多个参数逗号隔开 所以使用*打散
# _url = reverse('bl')
return redirect('bl')
"""
redirect括号内支持直接写别名 能够自动反向解析
但是该功能也仅仅局限于没有无名有名分组的情况 就需要借助有reverse方法
"""
publish_queryset = models.Publish.objects.all()
author_queryset = models.Author.objects.all()
return render(request, 'book_add.html', locals())

day09 orm查询优化相关的更多相关文章

  1. Django ORM那些相关操作zi

    Django ORM那些相关操作   一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...

  2. Django ORM 那些相关操作

    Django ORM 那些相关操作 一般操作 必知必会13条 <> all(): #查询所有的结果 <> filter(**kwargs) # 它包含了与所给筛选条件相匹配的对 ...

  3. orm查询优化 MTV和MVC模型 字段的chioces参数 Ajax

    目录 一.ORM查询优化 1. all()查询 2. only()/defer()方法 (1)only()方法 (2)defer()方法 3. select_related()/prefetch_re ...

  4. Django的ORM那些相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...

  5. Django之ORM那些相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  6. Django ORM那些相关操作

    一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/         官网文档 常用的操作 <1> all() ...

  7. ORM性能相关

    model: 先给一个简单的表结构 from django.db import models class User(models.Model): username=models.CharField(m ...

  8. Django之ORM查询优化

    目录 only 和 defer select_related 和 prefetch_related ORM字段参数 choices res = models.Book.objects.all() # ...

  9. Django框架之ORM的相关操作之分页(六)

    分页是每个项目必不可少要写的一个功能,该篇文章就将记录一下使用ORM写分页的过程. 假设我们的数据库里面需要显示一些数据,而这个表中的数据大约有几千条数据,那么我们不可能将所有的数据都显示出来,那么就 ...

随机推荐

  1. 力扣 - 剑指 Offer 67. 把字符串转换成整数

    题目 剑指 Offer 67. 把字符串转换成整数 思路1 根据题意,要解决这题,首先要判断的条件有: 不包括首位空格 第一位必须为:+.-.数字三者其一,否则不合法 数字必须连续的,如果遇到非数字, ...

  2. 计算机网络-3-2-点对点协议PPP

    点对点协议PPP 在通信链路较差的年代,在数据链路层使用可靠传输协议曾经是一种好方法,比较简单的点对点PPP协议则是目前使用最广泛的数据链路层协议. PPP协议的特点 互联网用户通过都要连接到某个IS ...

  3. C++ Qt 项目实战(一)之文本编辑器

    文本编辑器例图 项目开发环境 系统版本:windows10 QT 版本: 5.9.9 开发语言:C++ 已实现功能 文件操作:新建,打开,保存,另存为,打印,退出 编辑操作:复制,粘贴,剪切,查找,替 ...

  4. 地表最强IDE ——Visual Studio 2022正式发布

    地表最强IDE--Visual Studio 2022昨天正式发布啦! 堪称宇宙第一IDE工具集的Visual Studio,在经过不断更新优化之后,新版本就要与大家见面了.本次新版本发布,有许多令人 ...

  5. 后台管理系统:vue&node&MongoDB(一)

    后台管理系统 使用工具: Vue    Node     Mongodb   Element-ui 一.后台(Node+Mongodb) 前期准备: 需要下载的包: mongooes -------- ...

  6. sql关联修改

    UPDATE  p  set p.ClientID = c.id  from PaymentTable p left JOIN ClientTable c on p.ClientID = c.Clie ...

  7. python一对一教程:Computational Problems for Physics chapter 1-B Code Listings 1.7 - 1.12

    作者自我介绍:大爽歌, b站小UP主 ,直播编程+红警三 ,python1对1辅导老师 . 本博客为一对一辅导学生python代码的教案, 获得学生允许公开. 具体辅导内容为<Computati ...

  8. <C#任务导引教程>练习三

    /*Convert.ToInt("213165");int a=12345;string sn=a.ToString();//把a转换成字符串snint b=int.Parse(s ...

  9. [gym102220I]Temperature Survey

    (为了方便,以下记$a_{0}=0,a_{n+1}=n$​​,并将$n$​​加上1) 构造一个$n$行的网格图,从上到下第$i$行有$a_{i}$个格子,格子左对齐 记第$i$行第$j$个格子为$(i ...

  10. [atAGC052D]Equal LIS

    令$f_{i}$表示以$i$为结尾的最长上升子序列,显然可以快速预处理 令$L=\max_{i=1}^{n}f_{i}$,当$L$为偶数,考虑如下构造-- 将所有$f_{i}\le \frac{L}{ ...