Djangoday8

Djangoday8

一、Q查询进阶操作

from django.db.models import Q
q_obj = Q()  # 1.产生Q对象
q_obj.connector = 'or'  # 默认多个条件的连接是and可以修改为or
q_obj.children.append(('pk', 1))  # 2.添加查询条件
q_obj.children.append(('price__gt', 2000))  # 支持添加多个
res = models.Book.objects.filter(q_obj)  # 查询支持直接填写q对象
print(res)

二、ORM查询优化

1.ORM的查询默认都是惰性查询

如果你仅仅只是书写了ORM语句  没有用该语句所查询出来的参数
那么ORM会自动识别 直接不执行 这个性质可以提升效率 节省资源    

2.ORM自带分页查询(limit)

平时我们学习过程当中处理数据的量很少 我们没有注意到ORM自带的分页查询功能
将来在工作过程中要处理的数据上千万的  这个时候我们得关注一下ORM的分页查询 
如果没有分页查询功能那数据库内存也会  受不了的 直接回导致项目瘫痪 系统崩掉   

3.only与defer

res = models.Book.objects.only('title', 'price')  # only关键字查询详解
print(res)  # 结果是queryset对象[数据对象、数据对象]
for obj in res:
    print(obj.title)  # 点击括号内填写的字段 不走SQL查询语句
    print(obj.publish_time)  # 可以执行括号内没有的字段并获取数据 但是会走SQL查询语句
res = models.Book.objects.defer('title', 'price')  # defer关键字查询详解
print(res)  # 结果是queryset对象[数据对象、数据对象]
for obj in res:
    print(obj.title)  # 点击括号内填写的字段 走SQL查询语句
    print(obj.publish_time)  # 点击括号内没有的字段获取数据 不会走SQL查询语句

4.selected_related与prefetch_related

res = models.Book.objects.selected_related('authors')  # selected_related相当于连表查询 不支持多对多
for obj in res:
    print(res)
res = models.Book.objects.prefetch_related('publish')  # prefetch_related相当于子查询
for obj in res:
    print(obj.publish.name)

三、ORM事务操作

1.SQL事务相关理论知识

1.事务的四大特性(ACID)
    A(Atomicity 原子性)
    C(Consistency 一致性)
    I(Isolation 隔离性)
    D(Durability 持续性) 

2.相关SQL关键字
    start transaction;  # 启动事务
    rollback;  # 回退 回滚
    commit;  # 把事务保存到数据库
    savepoint;  # 在回滚中保存一个节点下次直接定位到此节点

3.相关SQL重要概念
    脏读:是指一个线程中的事务读取到了另外一个线程中未提交的数据
    幻读 :指一个线程中的事务读取到了另外一个线程中提交的insert的数据
    不可重复读: 是指一个线程中的事务读取到了另外一个线程中提交的update的数据
    MVCC多版本控制:是通过数据行的多个版本管理来实现数据库的并发控制

2.django orm 提供了三种开启事务方法

# 方法一:在配置文件里写如下代码 全局有效
'ATOMIC_REQUESTS':True
# 方法二:装饰器 局部有效
from django.db import transation
@transaction.atomic
def index():pass
# 方法三:with上下文管理  局部有效
from django.db import transation
def reg():
    with transaction.atomic():pass 

四、ORM常用字段

1.AutoFiled(primary_key=True)  # 主键
2.CharField(max_length=32)  # 字符
3.IntegerField  # 整型
4.BigIntegerField  # 大整型
5.DecimalField(max_digits=8, decimal_places=2)  # 十进制字段
6.DateField(auto_now, auto_now_add)	 # 年月日
7.DateTimeField(auto_now, auto_now_add)  # 年月日时分秒
8.BooleanField  # 传布尔值自动存0或1
9.TextField  # 存储大段文本
10.EmailField  # 存储邮件格式数据
11.FileField  # 传文本对象 自动保存到提前配置好的路径下并保存路径信息
# 可以自定义字段
class MyCharField(models.Field):
    def __init__(self,max_length, *args, **kwargs):
        self.max_length = max_length
        super().__init__(max_length=manx_length, *args, **kwargs)
        
    def db_type(self, connection):
        return 'char(%s)' % self.max_length
    
    
class User(models.Model):
    name = models.CharField(max_length=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  # 唯一值
db_index  # 给字段添加索引
choices  # 当某个字段的可能性能被列举完全的情况下使用
外键字段
to  #关联表
to_field  # 关联字段
on_delete=models.CASCADE  # 级联操作 当主表删除一条数据 从表关联数据同时被删除
on_delete=models.SET_NULL  # 当主表删除一条数据 从表关联字段设置为null 定义外键必须可以允许为空
on_delete=models.PROTECT  # 当主表删除一条数据 从表关联字段是受保护的外键 所以都不允许删除
on_delete=models.SET_DEFAULT  # 当主表删除一条数据 从表关联字段设置为默认值 定义外键必须有一个默认值
on_delete=models.SET()  # 当主表删除一条数据 从表关联字段设置为SET()中设置的值
on_delete=models.DO_NOTHING  # 什么都不做 一切都看数据库级别的约束
# 详细说一下choices参数 因为在项目里常用
class User(models.Model):
    name = models.CharField(max_length=32)
    info = MyCharField(max_length=64)
    gender_choice = (
         (1, '男性')
         (2, '女性')
         (3, '其他')
    )
    gender = models.IntegerField(choices=gender_choice,null=True)
user_obj = User.objects.filter(pk=1).first()
user_obj.gender
user_obj.get_gender_display()

六,Ajax请求

'异步提交 局部刷新'
Ajax不是一门新的技术并且有很多版本 
学习用的是jQuery版本
版本无所谓本质一样就可以
# 基本语法

$.ajax({
    url:'',  // 后端地址 三种填写方式 与form标签的action一致
    type:'post',  // 请求方式 默认是get
    data:{'v1':v1Val, 'v2':v2Val},  // 发送的数据
    success:function(){  // 后端返回结构之后自动触发 args接受后端返回的数据
        $('#d3').val(args)
    }
})
# Content_Type

1.urlencoded
	ajax默认的编码格式、form表单默认也是
	数据格式  xxx=yyy&uuu=ooo&aaa=kkk
 	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':'jason','age':18}),  // 数据要符合指定的类型 要言行一致哦
            contentType:'application/json',
            success:function (args) {
                alert(args)
            }

        })
    })
</script>
	后端需要从request.body中获取并自己处理
# Ajax携带文件数据

<script>
    $('#d3').click(function () {
        // 1.先产生一个FormData对象
        let myFormDataObj = new FormData();
        // 2.往该对象中添加普通数据
        myFormDataObj.append('name', 'jason');
        myFormDataObj.append('age', 18);
        // 3.往该对象中添加文件数据
        myFormDataObj.append('file', $('#d2')[0].files[0])
        // 4.发送ajax请求
        $.ajax({
            url:'',
            type:'post',
            data:myFormDataObj,

            // ajax发送文件固定的两个配置
            contentType:false,
            processData:false,
            success:function (args){
                alert(args)
            }

        })
    })
</script>
posted @ 2022-12-19 20:44  阿丽米热  阅读(13)  评论(0编辑  收藏  举报
Title