进入python的世界_day55_Django—ORM进阶操作、ORM事务、Ajax

一、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)
  • 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){
            
        }
    })
})

posted @ 2022-12-19 21:30  yiwufish  阅读(98)  评论(0)    收藏  举报