首页 > 其他分享 >Django框架——Q查询进阶、ORM查询优化、事务操作、字段类型、字段参数、Ajax、Content—Type、ajax携带文件

Django框架——Q查询进阶、ORM查询优化、事务操作、字段类型、字段参数、Ajax、Content—Type、ajax携带文件

时间:2023-04-30 11:33:08浏览次数:51  
标签:obj 进阶 models max 查询 length res Type

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的查询默认都是惰性查询
# 只要后面没有用到 查询就不会执行
2.ORM的查询自带分页处理
3.only与defer
"""
only是将括号内已有的字段封装到数据对象里面 后续点这些字段的时候不会走SQL 但是如果点括号里面没有的字段的时候就会走SQL defer与之相反
"""
	'''数据对象+含有指定字段对象的数据'''
    res = models.Book.objects.only('title','price')
    # print(res)  # queryset [数据对象、数据对象]
    # for obj in res:
        # print(obj.title)  # 点击括号内填写的字段 不走SQL查询
        # print(obj.price)
        # print(obj.publish_time)  # 可以点击括号内没有的字段获取数据 但是会走SQL查询
    res = models.Book.objects.defer('title', 'price')
    # print(res)  # queryset [数据对象、数据对象]
    # for obj in res:
        # print(obj.title)  # 点击括号内填写的字段 走SQL查询
        # print(obj.price)
        # print(obj.publish_time)  # 点击括号内没有的字段获取数据 不走SQL查询
4.select_related与prefetch_related
	# res = models.Book.objects.all()
    # for obj in res:
    #     print(obj.publish.name)  # 每次查询都需要走SQL
    
    # res = models.Book.objects.select_related('publish')  # 先联表后查询封装 不允许填写多对多的外键字段
    # for obj in res:
    #     print(obj.publish.name)  # 不再走SQL查询
    
    # res = models.Book.objects.prefetch_related('publish')  # 底层是子查询
    # for obj in res:
    #     print(obj.publish.name)

ORM事务操作

"""
1.事务的四大特性(ACID)
	原子性、一致性、隔离性、持久性
2.相关SQL关键字
	start transaction;
	rollback;
	commit;
	savepoint;
3.相关重要概念
	脏读、幻读、不可重复读、MVCC多版本控制...
"""
django orm提供了至少三种开启事务的方式
	方式1:配置文件数据库相关添加键值对		全局有效
        "ATOMIC_REQUESTS": True每次请求所涉及到的orm操作同属于一个事务
    方式2:装饰器							局部有效
        from django.db import transaction
       @transaction.atomic
       def index():
            ...
       	    return ...
    方式3:with上下文管理					局部有效
        from django.db import transaction
        	def reg():
                with transaction.atomic():
             	pass
            	return ...
"""
如果函数体代码中有错 则立刻回滚 且前面的代码不生效
只要函数走到return 无论return后面是否报错 前面执行的代码都生效
"""

ORM常用字段类型

AutoField
	primary_key=True
CharField
	max_length
IntegerField
BigIntergerField
DecimalField
	max_digits decimal_places
DateField
	auto_now auto_now_add
DateTimeField
	auto_now auto_now_add
BooleanField
	传布尔值自动存0或1
TextField
	存储大段文本
EmailField
	存储邮箱格式数据
FileField
	传文件对象 自动保存到提前配置好的路径下并存储该路径信息
	image = models.FileField(upload_to='文件上传的位置')
	image = models.ImageField(upload_to='图片')  # 只能上传图片
    
ORM还支持用户自定义字段类型
	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


    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			当某个字段的可能性能够被列举完全的情况下使用
	性别、学历、工作状态、...
    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 = models.User.objects.filter(pk=1).first()
    user_obj.gender
    user_obj.get_gender_display()

to 			关联表
to_field	关联字段
on_delete	当删除关联表中的数据时,当前表与其关联的表的行为
	1.models.CASCADE
   		级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
    2.models.SET_NULL
    	当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null,此时注意定义外键时,这个字段必须可以允许为空
    3.models.PROTECT
    	当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
    4.models.SET_DEFAULT
    	当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值
    5.models.SET()
    	当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值,与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数
    6.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接收后端返回的数据
            alert(args)
        }
    })

Content-Type

1.urlencoded
	ajax默认的编码格式、form表单默认也是
    数据格式  xxx=yyy&uuu=ooo&aaa=bbb
    django后端会自动处理到request.POST中
    
2.formdata
	django后端针对普通的键值对还是处理到request.POST中 但是针对文件会处理到resquest.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:fales,
            success:function(args){
                alert(args)
            }
        })
    })

标签:obj,进阶,models,max,查询,length,res,Type
From: https://www.cnblogs.com/XxMa/p/17365073.html

相关文章

  • Django4全栈进阶之路23 项目实战(报修类型表):应用程序命名空间app_name和分页组件pagina
    1、应用程序命名空间app_namefromdjango.urlsimportpathfrom.importviewsfrom.viewsimportRepairDetailViewapp_name='repair'urlpatterns=[path('repair_types/',views.RepairTypeListView.as_view(),name='repair_type_list�......
  • 3.子查询
    1、查询从来没有借过书的读者姓名。(分别使用notin、notexists和连接查询三种写法实现,体会写法的不同之处)--方式1:notinSELECTreaderNameFROMReaderWHEREreaderNonotin(SELECTreaderNoFROMBorrow);--方式2:notexistsSELECTreaderNameFROMReaderaWHERE......
  • typeScript声明文件的一个注意点:不能使用导入导出语法
    一、起因使用vue3+ts在写一个demo的时候,用到路由模块的时候,觉得需要自定义一个类型声明,所以写了一个.d.ts声明文件,而这个文件写完的时候,发现vscode老是提示找不到类型声明。 起初,我以为是ts配置文件写错了,没有在include里面写入这个文件,ts察觉不到。但是后来改来改去发现还是......
  • c语言报错 [Error] invalid initialization of non-const reference of type 'LinkQue
     进行地址传递是出现报错临时值不能作为非常量引用参数进行传递所以需要在main函数中·重新定义指针传递 ......
  • 3.子查询
    1、查询从来没有借过书的读者姓名。(分别使用notin、notexists和连接查询三种写法实现,体会写法的不同之处)SELECTreaderNameFROMReaderWHEREreaderNonotin(SELECTreaderNoFROMBorrow);SELECTreaderNameFROMReaderaWHERENOTEXISTS(SELECT*FROMBorrowbW......
  • Python之路【第十七篇】:Django【进阶篇】
    原博客笔记链接:https://www.cnblogs.com/wupeiqi/articles/5246483.html 1.Model到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:创建数据库,设计表结构和字段使用MySQLdb来连接数据库,并编写数据访问层代码业务逻辑层去调用数据访问层执行数......
  • cf-typedb2023-C
    题目链接:https://codeforces.com/problemset/problem/1787/C我是sb,这种dp都没想到。。。思路:首先得发现一个性质(贪心),每个数拆成的两个数一定是一个最大的(尽可能),另一个最小(尽可能)。这点不难证明,随便写写式子可得证。由于每个数只会影响相邻的两个数,所以我们可以dp算答案。......
  • [练习记录] 《算法竞赛进阶指南》打卡活动
    89.a^b题目大意给\(a,b,p\)求\(a^b\modp\)。思路可以直接快速幂。当模数\(p\)为\(1\)的时候特判一下。代码lla,b,mod;llqpow(lla,llb){ llres=1; while(b){ if(b&1)res=res*a%mod; a=a*a%mod,b>>=1; } returnres;}in......
  • 接口OSPF network-type不匹配导致主备倒换后远程无法访问路由器
    #新人福利#问题描述某省广域网口字型组网架构,IGP路由协议采用OSPF协议,业务正常时,远程可以通过主平面上联链路访问主平面路由器,当主平面上联链路故障时,远程应该可以通过备平面与主平面的横连链路访问主设备路由器。某次市广域主备倒换测试时,主平面路由器上联口down后,发现R10远程无法......
  • VIVADO 进阶
    原则合适的代码风格精准的时序约束管理高扇出网络层次化设计结构处理跨时钟域设计少而精的物理约束选择实现策略共享控制信号读懂日志报告TCL作用代码风格  高扇出网络  高扇出网络几乎是限制FPGA设计实现更高性能的第一大障碍,所以......