博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2020/03/04 02-查询集切片过滤器
阅读量:3922 次
发布时间:2019-05-23

本文共 3701 字,大约阅读时间需要 12 分钟。

每一个业务可以剖析成不同的功能,这些功能都是和数据相关的,所有的功能都离不开数据往往这些数据都需要持久化,这就数据就要进入数据库,要进行增删改查,有了orm这种框架,增删改查变成了对对象的操作。

一般现在都用orm,但是sql语句很重要,所以我们在执行的时候配置成可以看到sql语句。
也可以在modle类对象上,调用查询集的query方法,也可以看到执行的sql语句,最清楚的还是打印日志。一启动其实就链接了一次数据库

在这里插入图片描述

用户表里有id字段,确定唯一的一行,名字name,账号,手机,email,可以混合登录,并且这些都是唯一的,唯一键是有索引的,速度不慢,密码不可以明文,还可以设置个用户启用标签,删除的用户打个标签,还可以联系管理员恢复,或者进小黑屋什么的

用户表的管理一般是增删改查,增就是要提交数据,提交需要给一个url,最终要把这个url映射到某个view函数上,也就是url和view函数建立关系,url的路由。

建立好自己的应用,配置路由应该用多级的方式,每匹配一次把匹配部分去掉,剩下部分匹配下一次的

这两个配合在一起就叫restful的接口设计,这种也叫API设计,除了提供url和method还需要提供数据格式,这里都传了json,什么字段,这三个部分组合起来就叫restful风格的接口设计

在这里插入图片描述
做好路由配置
在这里插入图片描述
在这里插入图片描述
数据格式,每一个restful的接口都必须要提供url,method,提交的数据。这三样,一样都少不了
在这里插入图片描述
simplejson扔过去什么数据都可以处理,可以理解为增强版的json
在这里插入图片描述
客户端不能获得python中的异常,django的错误是用response来做的,作成网页端的响应,客户端时通过状态码来判断错对的
200系列都是对的
400系列是客户端访问导致的错误,401输入验证信息,404文件没找到,403权限拒绝
500服务器
在这里插入图片描述
错误写在这里,可以想办法在前端展示,比如用户名密码错误,或者用户名被禁用,也可以用jsonresponse,jsonresponse底层调用的也是httpresponse,可以把原因写在字典中,只不过出错要手动改状态码,比如status:400
在这里插入图片描述
在这里插入图片描述
要么把中间件关闭,测试的时候用的,上线就不要关了,建议打开
在这里插入图片描述
在这里插入图片描述
用户提交就需要form表单,我们就可以在表达里加csrf_token,生成一个hidden的input,这种往往放在模版页在这里插入图片描述
现在如果是前后端分离,用ajax,在请求的header里加x-csrftokenm,这些信息怎么来,其实很简单,可以访问特定页面就返回这个值即可,只要response值即可
在这里插入图片描述

得到了第一版本代码

在这里插入图片描述
在这里插入图片描述
浏览器端的代码写的再好,也避免不了用户躲避验证,绕开网页,比如直接用postman直接提交,也是没办法的,服务器端也需要验证。
还有csrf,也可以先用浏览器把值保存下来,用postman把这个头带上发给你,还是避免不了。
所以在后端服务器代码也要做验证,只要是客户端发来的数据,一个都不能信
在这里插入图片描述
这里是查一下email存在不存在,objects实际上是一个管理器
在这里插入图片描述
调用save里面会自动commit,一般注册成功会返回注册成功,但是不跳转,因为你还需要登录一次,甚至要去邮箱激活一把,才能允许登录,一般注册成功不会做什么事情,只会返回一个id,有id就告诉它注册成功,这个就是一种状态,习惯返回一个id
在这里插入图片描述
在这里插入图片描述
异常要返回,不能掉raise,因为都是response类的实例,

在这里插入图片描述

打开日志可以清楚看到sql语句,主要看db的信息
在这里插入图片描述在这里插入图片描述
这个是一个内建对象,只要构建成model类的子类,就会给你内部添加这个,这个称为管理器,可以自定义,但是一般不自己定义,不定义会提供一个objects的东西,称为管理器,管理器的类型
在这里插入图片描述

管理器是用来跟数据库打交道的,使用它就可以调用相应的操作,主要还是来做数据库查询的事情的,,增加save,修改也是save,只要你在写查询的时候,基本上就是前面user一个类.objects,提供了一些查询接口,django应用的每个接口模型里面可以定义多个管理器,至少有一个,没有就无法查询了

在这里插入图片描述
在这里插入图片描述
**数据的检验是放在save和update上 ,不调用save这些方法的时候,发现其实里面有一些数据是不合适的,实际上是不报错的 **

在这里插入图片描述

django的orm其实就是做增删改查,改成了对应的sql语句,orm最大的作用在于,屏蔽了与数据库之前的直接操作,用统一的对象操作可以来操作不同的关系型数据库,甚至可以操作非关系数据库redis。我们只需要告诉和什么数据库连接即可。
redis是基于kv对的,查询起来更快,也可以增删改

在这里插入图片描述

查询都会返回一个查询集,是一个数据的集合,会将你查询的内容都放在里面,和sqlalchemy一样惰性求值,不用数据就不查,如果只是把这个对象所有查询条件写好摆着,不调用消费者方法根本不查

惰性求值不会主动去查询,直到在迭代的时候(跟生成器一样,迭代了,生成器只能去生成数据),序列化把里面数据拿出来,数据库会把你符合的数据都发过来,数据很大想办法limit,序列化的时候也需要数据,所以也需要提前把结果集合返回来。

结果集本身是一个缓存,本身查询来的数据会放在客户端(数据库的客户端,也就是django写的程序)
在这里插入图片描述
这个缓存其实可以用,每个查询集都包含一个缓存,来最小化对数据库的访问,因为查询数据库是一件非常耗时的工作。首次查询是要查的,但是后面如果可以用缓存数据就用缓存数据
在这里插入图片描述在这里插入图片描述
看一个例子,到user的视图函数views,先这么写,注意这是. ,记得在生产的时候要limit*

在这里插入图片描述

配置一下url

在这里插入图片描述
现在过来的是空包
在这里插入图片描述
之前在sqlalchemy,all是消费者方法,只要调用就查了,这里还是没查,所以这里不能完全跟sqlalchemy对应起来
在这里插入图片描述
从users里遍历所有东西,并且立即用列表封起来

在这里插入图片描述

在这里插入图片描述
走一把现在就查了
在这里插入图片描述
这样做试试查几遍

在这里插入图片描述

在这里插入图片描述
只查了一遍
在这里插入图片描述
因为这是一个结果集,也就是遍历几遍结果集而已,所以就查一次
在这里插入图片描述
刚才是用同一对象遍历,结果集可以反复用。试试这样需要几遍
在这里插入图片描述
在这里插入图片描述
查询了两次,要操作的话尽量不要调用all方法两次在这里插入图片描述
还是建议这么用

在这里插入图片描述

在这里插入图片描述数据太大,想要切片
在这里插入图片描述

在这里插入图片描述

增加点用户
在这里插入图片描述
在这里插入图片描述

下一个

在这里插入图片描述
现在有三条数据,但是这个数据没有样子
在这里插入图片描述
加显示头,这两个是同样的函数
在这里插入图片描述
这里就受我们str的影响在这里插入图片描述
操作索引,都是从0开始
在这里插入图片描述
看看打印出来谁,试试切片
在这里插入图片描述

在这里插入图片描述

jerry就回来了
在这里插入图片描述
这么写看看怎么给你解决的sql语句
在这里插入图片描述

在这里插入图片描述

自动写了一个

在这里插入图片描述

把这个去掉
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按照道理应该是limit2

在这里插入图片描述

在这里插入图片描述
limit2,offset可以不写
在这里插入图片描述
现在不要这个,相当于没有用查询
在这里插入图片描述
在这里插入图片描述
多发送几次请求
在这里插入图片描述
并没有sql语句
在这里插入图片描述
按照以前的理解是切片立即执行,但是这里是不要数据就不查在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
其实是准备好了,但是我们没有真正调用数据就没有真正去查询在这里插入图片描述
从第11开始取10个人

这个是谁到谁,并不是偏移多少个

在这里插入图片描述
切片足够懒,不用不查
在这里插入图片描述

在这里插入图片描述

偏移20个取40个,其实是到40位置,偏移20个取10个,到30个位置在这里插入图片描述
在其他叫消费者方法,在这里叫过滤器

在这里插入图片描述

all相当于select * from一张表
在这里插入图片描述
filter写条件
在这里插入图片描述
这个条件就需要排除出去
在这里插入图片描述
在这里插入图片描述

返回一个对象字典列表,列表的元素是字典,字典内是字段和值 的键值对

在这里插入图片描述

在这里插入图片描述

提示不可以这么写
在这里插入图片描述
object上直接这么写

在这里插入图片描述

在这里插入图片描述
现在就可以了

在这里插入图片描述

上面写all ,下面写values,试试这样调用
在这里插入图片描述
在这里插入图片描述
前面是all查的,后面是values显示结果集,变成字典式了
在这里插入图片描述
现在写查询的时候最重要的是写filter
在这里插入图片描述
两个可以链接在一起写
在这里插入图片描述
只要是主键就用pk,pk会代替这个主键

在这里插入图片描述

现在把程序改改
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
pk=1and name=tom
在这里插入图片描述

在这里插入图片描述

给了两个参数 在这里插入图片描述
真实的字段名叫id

在这里插入图片描述

在这里插入图片描述
没有什么变化,这个pk就是指代主键的
在这里插入图片描述
提供单值的方法,查询出来提供一个值

在这里插入图片描述

get方法会返回单个满足条件的对象,如果返回不出,就直接抛出异常,只能是一条数据,超过或没有都抛出异常
在这里插入图片描述
查询总条目数
****
要么有数据,拿第一条,等于强制limit 1,没有数据返回none,不抛出异常
在这里插入图片描述
返回最后一个,没有数据返回none,不抛出异常
在这里插入图片描述
判断查询集是否有数据
在这里插入图片描述
可以理解为只要一条数据的filter
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在查一个没有的

在这里插入图片描述

在这里插入图片描述
直接抛出异常,get方法只能是一条,否则抛出异常
在这里插入图片描述
试试count方法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

试试first
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

可以前面加条件再first,这里对条件格式有严格要求
在这里插入图片描述
在这里插入图片描述
应该用like试试
在这里插入图片描述
可以进行这样的查询
在这里插入图片描述
id如果是主键可以用pk代替
在这里插入图片描述
有就回来,没有就是none

在这里插入图片描述

刚才只要查询条件不写等于=就出问题,因为大于小于不让写,这时候就需要用到查询表达式

在这里插入图片描述

两个下划线,独创的lookup表达式,这个等于号跟条件无关,这里还是小于3,不是小于等于3

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
小于等于怎么写,加个e试试
在这里插入图片描述
在这里插入图片描述
小于等于3来 了

在这里插入图片描述

大于等于,不要把等于号算进去在这里插入图片描述
在这里插入图片描述
这个就是lookup表达式

在这里插入图片描述

fillter查询条件,写比较计算的时候只能借助lookup表达式,解决filter的传参方式,把model类里的属性名+__两个下划线,所以model类的属性起名字的时候就有要求了
在这里插入图片描述
所以字段名不能这么写,因为lookup表达式就不能用了/在这里插入图片描述

转载地址:http://kozgn.baihongyu.com/

你可能感兴趣的文章
通过 .NET NativeAOT 实现用户体验升级
查看>>
如何友好的处理 WebApi 中抛出的错误
查看>>
因MemoryCache闹了个笑话
查看>>
Dotnet的垃圾回收
查看>>
乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时
查看>>
gRPC在C#中的未来属于grpc-dotnet
查看>>
快速排序的性能和名字一样优秀
查看>>
开源推荐:Asp.Net Core入门学习手册!
查看>>
ML.NET 示例:对象检测
查看>>
C#基于yolov3的行人检测
查看>>
ML.NET Cookbook:(16)什么是规范化?为什么我需要关心?
查看>>
WPF 修改(优化)Menu菜单的样式
查看>>
我开发了一款基于web容器的前端项目容器
查看>>
WPF实现环(圆)形菜单
查看>>
WPF 写一个提醒工具软件(完整项目)
查看>>
Windows 11 快速体验:开始菜单居中,全系圆角设计!
查看>>
异步流使用注意事项
查看>>
NET问答: 为什么仅有 getter 的属性,还可以在构造函数中赋值 ?
查看>>
WPF TextBox限制只能输入数字的两种方法
查看>>
【荐】牛逼的WPF动画库:XamlFlair
查看>>