今日内容详细
Q查询进阶操作
使用Q查询记得先导入
from django.db.models import Q
# 1.先产生Q对象
q_obj = Q()
# 2.默认多个条件的连接条件是and可以修改为or
q_obj.connector = 'or'
# 3.添加查询条件(pk为1 的数据)
q_obj.children.append(('pk',1))
# 也可以添加多条(pk为1 或者 money字段大于2000的数据)
q_obj.children.append(('money',2000))
# 查询支持直接填写q对象
res = models.Book.objects.filter(q_obj)
print(res)
ORM查询优化
# 1.ORM的查询默认都是惰性查询
惰性查询:在查询获取结果后 如果没有使用到该结果 则不走sql查询
# 2.ORM的查询自带分页处理
为了避免数据过多导致内存崩坏 ORM在查询时自带分页处理
# 3.only和defer
'''数据对象+含有指定字段对应的数据'''
'''only'''
res = models.Book.objects.only('title','monely')
print(res) 结果为:queryset [数据对象、数据对象]
for i in res:
print(obj.title) # 不走sql查询
print(obj.monely) # 不走sql查询
print(obj.push_time) # 可以查询数据 但是会走sql查询
'''defer'''
res = models.Book.objects.defer('title','monely')
print(res) 结果和上面一样: queryset [数据对象、数据对象]
for i in res:
print(obj.title) # 走sql查询
print(obj.monely) # 走sql查询
print(obj.push_time) # 走sql查询
'''
总结:only针对括号里的字段不会走sql查询 如果是括号里没有的字段则会走sql查询 而defer恰好相反
'''
# 4.select_related与prefetch_related
res = models.Book.objects.all()
for obj in res:
print(obj.out_key.name) # 每一次循环都会走sql查询
'''select_related'''
res = models.Book.objects.select_related('out_key') # 先连表后查询封装
for i in res:
print(obj.out_key.name) # 不会再走sql查询
'''prefetch_related'''
res = models.Book.objects.perfetch_related('out_key') # 子查询
for i in res:
print(obj.out_key.name)
ORM事务操作
'''
1.事务的四大特性(ACID):
原子性、一致性、隔离性、持久性
2.相关SQL关键字
start transaction; 开启事务
rollback 回滚
commit; 提交
savepoint; 设置节点
3.相关重要概念
脏读、幻读、不可重复读、MVCC多版本控制...
'''
django orm提供了至少三种开启事务的方式
# 方式一:配置文件数据库相关添加键值对 全局有效
'ATOMIC_REQUESTS':True
每次请求所涉及到的orm操作同属于一个事务
# 方式二:装饰器 局部有效
from django.db import transaction
@transaction.atomic
def index():pass
# 方式三:with上下文管理 局部有效
from django.db import transaction
def reg():
with transaction.atomic():
pass
ORM常用字段类型
AuthFiled
int 自增字段,必须填入参数 primary_key = True 当model中没有自增列,则会自动创建一个名为id的列
IntegerField
一个整数类型,范围在-2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),可以直接用字符串存,)
DecimalField
十进制小数
参数:max_digits 小数总长度 decimal_places 小数位长度
CharField
字符类型,必须提供max_lengeh参数,表示字符的长度
BigInteegerField
也是整数类型,范围比IntegrField更大
DatelField
日期 YYYY-MM-DD
其中两个重要的参数: auto_now(获取当前时间 动态) auto_now_add(获取当前时间 静态)
DateTimeField
日期+时间格式
同时也有auto_now和auto_now_add两个参数(和上面的用法一致)
BooleanField
传布尔值自动存0或者1
TextField
存储大段的文本
EmailField
存储邮箱格式数据
FileField
传文件对象 自动保存到提前配置好的路径下并存储该路径信息
OMR自定义字段
#eg:
class MycharField(models.Field):
def __init__(self,max_lenth,*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
class User(models.Model):
name = models.CharField(max_lengrh=32)
info = MyCharField(max_length=64)
ORM常用字段参数
primary_key 主键
verbose_name 注释
max_length 字段长度
max_digits 小数的总位数
decimal_places 小数点后的位数
auto_now 每次操作数据自动更新时间
auto_now_add 首次创建自动更新后续不再更新
null 允许字段为空
default 给字段添加默认值
unique 唯一值
da_index 给字段添加索引
choies 当某个字段的可能性能够被列举完全的情况下使用
'''
性别、学历、工作状态......
class User(models.Model):
name = models.CharField(max_length=32)
info = MyCharField(max_length=64)
#提前列举好对应关系
gender_choice = ((1,'男性'),(2,'女性'))
gender = models.IntegrField(choices=gender_choice,numm=True)
user_obj = User.objects.filter(pk=1).first()
user_obj.gender
user_obj.get_gender_display()
'''
ForeignKey(关系字段)
to 关联表
to_field 关联字段
on_delete 级联操作 当主表数据删除时 与之相关的数据也会被删除
# models.CASCADE(常用)
级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
# models.SAT_NULL
当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为Null,此时注意定义外键时,这个字段要设置可以为空(Null=True)
# models.PROTECT
当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
# models.SET_DEFAULT
当主表中的一条数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值
# models.SET
当主表中的一条数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段需要有一个默认值
# models.DO_NOTHING
开摆,什么都不干,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的models.PROTECT相似
Ajax
# 作用:异步提交 局部刷新
ajax不是一门新的技术并且由很多版本 我们目前学习的是jQuery版本
'''版本不重要 其本质是一样的'''
# 基础语法
$.ajax({
url:'', # 后端地址 三种填写方式 与form标签的action一致
type:'post', # 请求方式 默认为get
data:{'v1':v1val,'v2':v2val}, # 发送的数据
success:function(args){
# 后端返回结果之后自动触发 args接收后端返回的数据
$('#d3').val(args)
}
})
Content-Type
1.urlencoded
ajax默认的编码模式、form表单默认也是
数据格式 xxx=yyy&uuu=ooo
django后端会自动处理到request.POST中
2.formdata
django后端针对普通的键值对还是处理到request.POST中 但是针对文件处理到request.FILES中
3.application/json
form表单不支持 ajax可以
<script>
$('#d1').click(function(){
$.ajax({
url:'',
type:'post',
data:JSON.stringify({'name':'json','age':18}),
contentType:'application/json',
success:function(args){
alert(args)
}
})
})
</script>
#后端需用从request.body中获取并自己处理
ajax携带文件数据
<script>
$('#d3').click(function(){
// 1.先产生一个FormData对象
let myForDataobj = new FormData();
// 2.往该对象中添加普通字段
myForDataObj.append('name','xiaochen');
myForDataObj.append('age',18);
// 3.往该对象中添加文件数据
myFormDataObj.append('file',$('#d2')[0].files[0])
// 4.发送ajax请求
$.ajax({
url:'',
type:'post',
data:myFormDataObj,
// ajax发送文件固定的两个配置
contentType:false,
processData:false,
seccess:function (args){
alert(args)
}
})
})
</script>
标签:obj,models,max,尾巴,查询,Ajax,ORM,res,print
From: https://www.cnblogs.com/xiaochenxiangchangpang/p/16992944.html