一、ORM进阶操作
1.Q查询进阶
- Q查询还可以将查询的字段改为字符串形式
q_obj = Q()
q_obj.connector='or' #q对象默认是多个条件 也是and关系 可以修改为or
q_obj.children.append(('pk',1))
q_obj.children.append(('pin;ish_id',3)) # 不停的给这个Q对象塞条件
res = models.Book.objects.filter(q_obj) # 按完成的Q对象筛选
print(res)
2.ORM查询优化
- django中 orm默认都是惰性查询,orm语句的代码只有后续使用到才会去执行
- django orm自带limit分页,为了减轻数据库压力
3.ORM查询优化之only与defer
-
only:
用only 查询返回数据对象 封装了括号里选择的字段,当查封好的字段时,不需要再执行SQL,不过这个对象 也支持括号里没有的字段名 只是它会去数据库里面查这个值(要再走一次SQL)
-
defer
defer相反 数据对象点击括号内封好的字段, 每次都会走SQL查询,而查括号内没有的字段不会走数据库查询
res = models.Book.objects.only('title','price')
for obj in res:
print(obj.title)
print(obj.price)
print(obj.publish_time)
4.ORM查询之select_related与prefetch_related
- select_related
select_related底层是inner join连表, 括号内只能接收外键字段(一对多 一对一)自动连表 得出的数据对象在点击表中数据的时候不会再走数据库查询
res = models.Book.objects.select_related('publish')
for obj in res:
print(obj.name)
- prefetch_related
prefetch_related底层其实是子查询,将查询之后的结果也一次性封装到数据对象中 用户在使用的时候是感觉不出来的
res = models.Book.objects.prefetch_related('publish')
for obj in res:
print(obj.publish.name)
二、事务操作
django orm提供了至少三种开启事务的方式
方式1:配置文件数据库相关添加键值对 全局有效
"ATOMIC_REQUESTS": True每次请求所涉及到的orm操作同属于一个事务
方式2:装饰器 局部有效
from django.db import transaction
@transaction.atomic
def index():pass
方式3:with上下文管理 局部有效
from django.db import transaction
def reg():
with transaction.atomic():
pass
三、模型层常见字段
AutoField() # int自增列
CharField() # 字符类型
IntegorField() # 一个整数类型
BigIntegerField() #长数型(有符号)
DateField() # 日期字段
DateTimeField() #日期时间端
DecimalField() #十进制 小数
EmailField() # 字符串类型,提供验证机制
BooleanField() # 传布尔值存数字0或1
TextField() # 存储大段文本
FileField() # 存储文件数据 自动找指定位置存储 字段存具体路径
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
四、常见字段参数
max_length #最大 长度
verboses_name # 备注
auto_now # 配置上auto_now=True,每次更新数据记录的时候会更新该字段。
auto_now_add # 配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
null #表示某个字段可以为空
default #为该字段设置默认值
max_digits # 总位数
unique=True #该字段在此表中必须是唯一的
db_index=True #代表着为此字段设置索引
choices #当字段数据的可能性是可以完全列举出来的时候 应该考虑使用该参数 性别、学历、成绩
关键字参数
to # 设置要关联的表
to_field # 设置要关联的字段
related_name # 起别名
on_delete # 当删除关联表中的数据时,当前表与其关联的行的行为。(参考上面的例子)
五、Ajax
大佬封装的,我们只要学会使用即可
异步提交 局部刷新
与form表单区别 :可以自动复制一份给后端校验
1.基础语法
$.ajax({
url:'', 控制数据的提交地址
type:'', 控制请求方式 (默认get请求)
data:{}, 组织提交的数据
success:function(形参){
异步回调函数
}
})
2.数据编码格式
Content-Type
格式一:urlencoded
数据格式: name=jason&pwd=123&hobby=read
django后端统一处理到request.POST
_______________________________________
格式二:formdata
数据格式:无法查阅
django后端自动将文件数据处理到request.FILES普通数据request.POST
———————————————————————————————————————
格式三:application/json
数据格式:json格式
django后端不会处理 在request.boby中存储(bytesl类型)自己处理
语法注意事项
3.ajax携带文件数据
$('#d3').click(function(){
1.产生内置对象
let formData = new FormData();
2.添加普通数据
formData。append('username',$('#d1').val())
3.添加文件数据
formDate.append('file',$)
4.发送ajax请求
$.ajax({
url:'',
type:'post',
data:formData,
contentType:false, // 不适用任何编码
processDate:false, // 不处理数据格式
success:function(args){
}
})
})
标签:obj,进阶,python,res,related,查询,ORM,max
From: https://www.cnblogs.com/wznn125ml/p/16993118.html