首页 > 其他分享 >ORM的一些尾巴和Ajax的基础

ORM的一些尾巴和Ajax的基础

时间:2022-12-19 19:44:09浏览次数:39  
标签:obj models max 尾巴 查询 Ajax ORM res print

今日内容详细

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

相关文章