Q查询的进阶操作
实际上就是利用字符串查询,这样就可以跟用户交互
from jango.db.model import Q
q_obj = Q() 先产生一个q对象
q_obj.children.append(('pk',1)) 表示给q对象添加查询条件pk=1,只是pk变成了字符串
res = models.Book.ojbects.filter(q_obj) 这样查询的也是pk=1的书籍
注意:
q对象可以添加多个条件,多个条件默认是and的关系
q_obj.connector = 'or' 可以将多个条件的关系改为or
ORM查询优化
1.ORM查询默认都是惰性查询,使用到查询结果才会执行SQL语句,没使用到不会执行
2.ORM自带分页处理,直接查询多条结果,SQL语句在底层执行的时候自动带分页操作,防止打印的记录过多出现内存不足的情况
3.only与defer
当使用only查询时,SQL在查询括号内的字段时会直接封装到结果中,所以当我们使用括号内的字段时不会再执行SQL语句,而使用括号没有的字段名则会重新执行SQL语句,而defer与之相反
4.select_related与prefetch_related
第一种是连表查询,第二种是子查询,实际看不出来区别,但是底层SQL执行的语句是有区别的
ORM事务操作
"""
数据库事务的4大特性:原子性、一致性、隔离性、持久性
"""
OMR三种开启事务的方式:
方式1:配置文件数据库相关添加键值对,全局有效
"ATOMIC_REQUESTS": True每次请求所涉及到的orm操作同属于一个事务
方式2:装饰器 函数/类内部有效
from django.db import transaction
@transaction.atomic
方式3:with上下文管理 局部有效
with transaction.atomic():
ORM常用字段
AutoField 自称主键使用
CharFiled 字符类型 max_lenght()
DateField 时间
IntegerField 整形
DecimalField 小数 max_digits decimal_places
TextField 文本
EmailField 邮箱
ORM常用字段参数
primary_key 主键
verbose_name 注释
auto_now 每次操作自动更新时间
auto_now_add 记录第一次创建时间
null 是否为空
default 默认值
choice 选择
to 关联表面
to_field 关键字段
on_delete 级联删除
choice用法展示
class User(models.Model): # 创建表
name = models.CharField(max_length=32)
info = models.CharField(max_length=64)
gender_choice = ((1,'男性'),(2,'女性'))
gender = models.IntegerField(choice=gender_choice)
提前把所有的关系全部罗列出来,然后添加选择选项中
Ajax操作
异步提交 局部刷新
$.ajax({
url:'',
type:'post',
date:{'name':'jason'},
success:function(接收后端想用的数据){}
})
使用ajax交换,那么后端返回的数据会被args接收,不再直接影响整个浏览器页面
Ajax补充说明
针对毁掉函数args接收的响应数据
1.后端request.is_ajax() 用于判断当前请求是否是由ajax发起的
2.后端返回的三板斧都会被args接收不再影响整个浏览器页面
3.选择使用ajax做前端交互的时候,后端一般返回的都是字段数据
user_dict = {'cod':10000,'username':'jason'}
多对多的三种创建方式
1.全自动创建,自己指定虚拟外键,由django帮我们创建第三场表
优点:自动创建,并且提供了add/remove/set/clear四种操作方式
缺点:扩展性比较差
2.纯手动创建,自己创建第三张表,创建关联关系
优点:扩展性比较高
缺点:繁琐,没办法使用四种操作方式,正反向查询也不能使用
3.半自动创建,自己创建第三张表,但是使用自动创建写虚拟字段,指定
优点:扩展性高,也可以使用正反向查询
缺点:没办法使用四种操作方式
forms组件
1.自动校验数据,提前定义好要求的类,然后在视图函数中利用获取到的信息产生类的对象,就可以进行信息的校验
2.forms组件渲染标签
{% for forms in forms_obj %}
{{forms.label}}
{{forms}}
这个渲染是循环取出每一个froms标签的用户输入框,先打印label值,再打印标签
注意事项:
forms组件只负责渲染获取用户数据的标签,也就意味着from标签与按钮标签需要自己写
forms组件校验补充
froms组件针对字段数据的校验,提供了三种类型的校验方式
1.直接写参数
2.使用正则表达式
3.钩子函数 局部钩子 全局钩子
django中间件
django默认有7个中间件,并且还支持用户自定义中间件
中间件主要可以用于:网站访问频率的校验,用户权限的校验等全局类型的功能需求
process_request
1.请求来的时候会自动从上往下执行该方法,没有则跳过
2.如果该方法自己返回了HttpResponse对象那么不再往后执行而是直接原路返回
process_response
1.响应走的时候会从下往上经过每一个注册了的中间件里面的该方法,没有则跳过
2.该方法必须有两个形参request,response,形参response指代的就是后端想要返回给前端的信息
process_view
路由匹配成功之后执行视图函数/类之前自动触发
process_exception
视图函数、类执行报错自动触发
process_template_response
视图函数/类返回的HttpResponse对象含有render并且对应一个方法的时候自动触发
标签:第十三,回顾,创建,校验,查询,forms,ORM,内容,SQL
From: https://www.cnblogs.com/zhanghong1229/p/17006106.html