day 68 django 之api操作 | jQueryset集合与对象
我们的orm里面分为:
jQueryset集合,
还有对象,
我们的jqueryset集合里面可以有多个对象,这句话的意思就是我们的对象是最小的单位,不可以再拆分了,我们的jQueryset集合就相当于是一个容器我们的一个个对象就放到这个容器里面,不论容器里面是否只有一个对象,还是没有对象,容器就是容器,本质是不会变的,就像我们的碗,即便是空碗里面什么都没有,它本质也是一个碗一样.
这里要强调它的本质,是因为我们的jQueryset集合和对象是分属于不同的领域,他们对应的方法也是不一样的,我们的jQueryset集合根本上的主流应用场景就是对我们的数据库的表格操作,对象也是一样的,
那么我们首先是需要先得到jQueryset集合或者是对象然后才能拿着它去数据库里面进行操作,下面的api常用方法就是帮我们拿到jQueryset集合或者是对象的方法,使用它们会有返回值,我们根据得到的返回值就可以知道是对象还是jQueryset集合,然后我们调用对应的方法
我们的对数据库的操作就是增删改查,
在jQueryset集合里面,我们的这个容器就类似于一个集合,我们的集合数据类型是可以在里面添加,修改,删除,查询对象的.
在对象里面,我们可以得到一个对象,然后对这个对象它本身就是最小的单位了,就像我们上面提到的,它是不可再拆分的,那么我们得到了它之后就无需再对它进行查询了,它本身就是我们查询的结果,然后同理,它本身就是结果了,我们也无需再对它进行增加了,它本身就是最小的单位了,无从增加,但是可以进行修改和删除,我们可以得到了这个对象然后把它删除,或者修改它,使用字典里面直接等于的方法,例如:对象.字段名(需要修改的字段值)=[新赋值的变量值]然后对象名.save()保存修改即可,我们的字典是直接使用到了key=新赋予的变量值,然后就完成了修改,但是在orm里面我们需要多一步操作保存修改save(),
teacher_obj=models.Teacher.objects.get(id=arg)
teacher_obj.tname=tname
teacher_obj.save()
所以我们的对象就只有删除和更改两个应用场景的操作,删除使用delete(),修改用赋值的方式加上save()
而jQueryset集合里面有增删改查,{创建数据使用create(),} add(),delete(),update(),-----[exclude,all,filter]这里的中括号里面的都是查询
queryset与惰性机制
我们的queryset内部是一个可迭代对象,它的特点就是惰性运算,我们的数据在里面生成之后就只是保存到里面而已,如果不调用他们,就会一直在里面存着不会显露出来,直到我们调用它才会有数据倒出来,queryset特点: 可迭代,可切片
objs=models.Book.objects.all() # 假设objs里面有很多个值[obj1,obj2,obj3,,,,,]
for i in objs:
print('obj:' i)
print(objs[1])
print(objs[1:4])
print(objs[::-1]) # 这里如果忘记了就提醒一下,我们的切片是从0到0,然后倒序切,从后往前开始切隔一个取一个值,
queryset的高效使用:
<1>django的queryset是惰性的
django的queryset对应于数据库的若干记录row,通过可选的查询来过滤,例如,下面的代码会得到数据库中国名字为'Dave'的所有人:Person_set=Person.objects.filter(first_name='Dave')
上面的代码并没有运行任何的数据库查询,你可以使用person_set,给它加上一些过滤条件,或者将它传给某个函数,这些操作都不会发送给数据库,这是对的,因为数据库的查询是显著影响文本应用性能的因素之一, <2>要真正从数据库获得数据,你可以遍历queryset或者使用if queryset,总之你用到数据时就会执行sql,为了验证这些,需要在setting里加入logging(验证方式)
obj=models.Book.objects.filter(id=3)
#for i in obj:
# print(i)
# if obj:
# print('ok') <3>queryset是具有cache的当你遍历queryset时,所有匹配的记录会从数据库获取,然后转换成django的model.这被称为执行(evaluation).这些model会保存在queryset内置的cache中,这样如果你再次遍历这个queryset,你不需要重复运行通用的查询, obj=models.Book.objects.filter(id=3)
# for i in obj:
# print(i) models.Book.objects.filter(id=2).update(title='go')
obj_new=models.Book.objects.filter(id=4)
# for i in obj:
# print(i) # logging只会打印一次 <4>简单的使用if语句进行判断也会完全执行整个queryset并把数据放入cache,虽然你并不需要这些数据!,为了避免这个,可以用exists()方法来检查是否有数据: obj=Book.objects.filter(id=2)
exists() 的检查可以避免数据放入queryset的cache,
if obj.exists():
print('hello world!') <5>当queryset非常巨大时,cache会成为问题处理成千上万的记录时,将它们一次装入内存是很浪费的,更糟糕的是,巨大的queryset可能会锁住系统进程,让你的程序濒临崩溃,要避免在遍历数据的同时产生queryset cache, 可以使用iterator()方法来获取数据,处理完数据就将其丢弃,
objs=Book.objects.all().iterator()
iterator()可以一次只从数据库获取少量数据,这样可以节省内存
for i in objs:
print(obj.name)
# but,在此遍历没有打印,因为迭代器已经在一次遍历(next)到最后一次了,没得遍历了,
for i in objs:
print(i.name) # 当然,使用iterator()方法来防止生成cache,意为这遍历同一queryset时会重复执行查询,所以使用iterator()的时候要当心,确保你的代码在操作一个大的queryset时没哟重复执行查询 总结:queryset的cache是用于减少程序对数据库的查询,在通常的使用下会保证只有在需要的时候才会查询数据库,使用exists()和iterator()方法可以以优化程序对内存的使用,不过,由于它们并不会生成queryset cache,可能会造成额外的数据库查询
前情回顾一下,:
django项目
安装:
创建项目
配置(setting,static,csrf)
创建app,python manage.py startapp app1
三部分
urls.py路由配置
1,普通正则
2分组正则
传位置参数:url(r'^blog/(\d+)/',views.blog)
3分组命名(得到的是关键字参数)
url(r'^blog/(?P<year>(\d+)/',views.blog')) 视图函数要传参blog(request,year)
4用name指定别名
url(r'^blog/$', views.blog, name='blog') 这里我们使用别名来进行反向解析,为了得到动态的HTML页面跳转效果
html里面:{%url 'blog'%}
views函数里面from django.urls import reverse
函数返回值里面return reverse("blog")
5使用命名空间
url(r'^blog/', include(app1.urls,namespace='num1' 2017 12)) 这里也牵涉到反向解析
HTML里面{% url 'num1:blog'%} url后面空一格写单引号,引号里面写namespace然后冒号name
views里面:from django.urls import reverse 返回值return redirect(reverse("num1:blog",arg=(2017,12)))
views.py
request对象
response对象
FBV和CBV
模板语言
{{变量}}
{{变量.}}如果变量是一个字典,我们直接使用这样的方法去取值
{%for%}循环
{%endfor%}结束循环
{%if%}判断
{%endif%}结束判断
过滤器(filter) {{变量名|filter_name:参数}}
{{时间对象|date:'Y-m-d'}}
{%url%}
{%load static%}
{%static 'img/1.png'%}
母板,继承,块,组件
连接数据库(orm)
五步四部分
1创建数据库
2在app下的models.py里面创建model类,继承models.Model
3.在setting.py里面配置数据库连接信息
4在项目project的init里面写上import pymysql, pymysql.install_as_mysqldb() # 这一句使用我们的pycharm会自动补全,有提示信息
5,发命令
python manage.py makemigrations # 收集变更
python manage.py migrate # 翻译成sql语句执行
四部分
models.py
django
pymysql
mysql
orm:类 数据表
类的属性
数据列 (表里面的字段)
对象 数据行
对表格进行增删改查:
查:
models.类名,objects.all() 取到所有的数据是一个列表 [取不到值是不会报错的,就显示为空]
models.类名,objects.get() 取到一个对象[特点是取不到值就会报错]
models.类名.objects.exclude(条件) 得到除了这个条件的其他的结果
models.类名.objects.first()
models.类名.objects.last()
增加:
一种方式:
models.类名.objects.create(name='peter')
一种方式:
obj = models.类名(name='peter')
obj.save()
删除:
models.类名,objects.filter(age=19).delete()
修改:
models.类名.objects.filter(age=90).update(name='greate')
单个对象是不能够调用update的[只有jQueryset才可以调用update方法]
update()方法对于任何结果集queryset均有效,这意味着我们可以同时更新多条记录update返回的是一个整型数据类型,表示受影响的条数
我们的对象要想使用修改操作只能够使用下面的方式直接赋值
obj=models.类名.objects.get(id=1)
obj.name='green'
obj.save()
今日内容:
单标的增删改查
单表查询的api介绍:
13条常用数据:
返回的是queryset对象
0.update()
1.all()
2.filter()
3.exclude()
4.values()
5.values_list()
6.order_by()
7.reverse()
8.distinct()
9.create()
10.delete()
11.order_by()
12.values()
13.values_list()
返回数字的:
count()
返回bool值的:
exists()
返回具体的数据对象的:
get()
first()
last()
delete()
下划线用法:
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 models.Tb1.objects.filter(id__range=[1, 3]) # id范围是1到3的,等价于SQL的bettwen and 类似的还有:startswith,istartswith, endswith, iendswith date字段还可以:
models.Class.objects.filter(first_day__year=2017)
在我们的pycharm里面python console里面先引入我们的models, from app名称 import models
然后就输入上面的命令即可
logging配置参数:
logging={
'version':1, # 目前为止只有这一个值,当前使用版本
'disable_existing_loggers':false, # 不禁用已经存在的logger实例
# 定义一些日志的处理方式
'handlers':{
'console':{
'level':''DEBUG'',
'class':'logging.streamhandler',
},
},
'loggers':{
'django.db.backends':{
'handlers':['console'],
'propagate':True, # 向上传导
'level':''DEBUG'',
},
}
}
day 68 django 之api操作 | jQueryset集合与对象的更多相关文章
- Django QuerySet API文档
在查询时发生了什么(When QuerySets are evaluated) QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作.只要你查询的时候才真正的操作数据 ...
- Django模型-数据库操作
前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...
- django模型查询操作
一旦创建好了数据模型,Django就会自动为我们提供一个数据库抽象API,允许创建.检索.更新和删除对象操作 下面的示例都是通过下面参考模型来对模型字段进行操作说明: from django.db i ...
- Django 2.0 学习(16):Django ORM 数据库操作(下)
Django ORM数据库操作(下) 一.增加表记录 对于表单有两种方式: # 方式一:实例化对象就是一条表记录france_obj = models.Student(name="海地&qu ...
- django 通过orm操作数据库
Django Model 每一个Django Model都继承自django.db.models.Model 在Model当中每一个属性attribute都代表一个database field 通过D ...
- Django~表的操作
增(create , save) from app01.models import * #create方式一: Author.objects.create(name='Alvin') ...
- django models 数据库操作
django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class ...
- jackson学习之三:常用API操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Django之ORM操作
Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...
随机推荐
- 鼠标hover图片时遮罩层匀速上升显示内容top、定位
1.html <div class="div1"> <div class="div11"> <p >Dolor nu ...
- Oracle数据库内存使用情况分析查看
SGA.PGA使用情况 select name,total,round(total-free,2) used, round(free,2) free,round((total-free)/total* ...
- Confluence 6 上传站点图标后重置你的配色方案
当你上传一个站点标识图片后,Confluence 会根据你上传的图片文件自动侦测使用的颜色,并为你设置自动配色方案. 你可以按照上面描述的方法修改色彩配色方案,或者你也可以重置配色方案为默认的配色方案 ...
- 【数据库】MySQL的左连接、右连接和全连接的实现
表student:+----+-----------+------+| id | name | age |+----+-----------+------+| 1 | Jim | 18 || 2 | ...
- Java测试的题目感想
日期:2018.9.24 星期一 博客期:012 说起来测试真的是来的时候信心满满,考完的时候慌得出神!我感觉自己会用Scanner类做输出和文件操作就可以在有限时间内把它搞出来了!事实证明我错了!我 ...
- mysql 安装问题二:mysqld: Can't create directory 'E:\Software\mysql-5.7.24-winx64\data\' (Errcode: 2 - No such file or directory)
原因:my.ini文件中的basedir(设置mysql的安装目录).datadir(设置mysql数据库的数据的存放目录)与MySQL解压后的路径不一致 解决办法: 将basedir=E:\Soft ...
- python(8):面向对象编程
有三种程序类型: (1)面向过程:按照一定的逻辑顺序,一步步垒代码 (2)面向函数:对用常用的计算,建立函数避免重复 (3)面向对象: 函数的集合,对函数进行分类和封装 (一) 抽象 抽象: 哈巴狗, ...
- poj2116 模拟题
不知道错在哪里 /* 给定两个斐波那契表示数,要求用标准化表达方式表达 然后将这两个数加起来,和也用标准化方式表达 思路:显然要将这两个数先用十进制表示,和也用十进制表示 然后在转化成二进制即可 1 ...
- CF 1042F
玄学贪心... 题意:给出一棵树,要求将他的所有叶节点分成最少的组,且在每组中的任意两节点之间的距离不大于k 解析: 显然是个贪心啦... 稍微考虑一下贪心思想: 我们从下向上合并整棵树,在合并到某个 ...
- php 数组函数学习
1.array_change_key_case array_change_key_case(array,case)函数将数组的所有的键都转换为大写字母或小写字母.array表示目标数组,case表示转 ...