首页 > 其他分享 >Q查询优化,ORM查询 常用字段参数类型,AJax携带文件数据

Q查询优化,ORM查询 常用字段参数类型,AJax携带文件数据

时间:2023-05-04 19:12:02浏览次数:52  
标签:obj models max 查询 AJax 常用字 res print

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:将括号里面的字段封装成数据对象,点括号里面的字段走SQL查询,没有的不走SQL查询
'''

only:
	'''数据对象+含有指定字段对应的数据'''
    # 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查询
  defer: 
    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
select_related:
    是连表操作,先把表 inner join 拼起来再整体封装成对象
 prefethc_related:
    相当于子查询,先查一张表,再查另一张表,然后将两张表的结果封装起来
    
在用的时候是感觉不出来的
    
	  res = models.Book.objects.all()
     for obj in res:
         print(obj.publish.name)  # 每次查询都需要走SQL
     res = models.Book.objects.select_related('authors')  # 先连表后查询封装
     res1=models.Author.objects.select_related('author_detail')  # 括号内不支持多对多字段 其他两个都可以
    print(res1)
    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():pass	
 	方式3:with上下文管理					局部有效
       from django.db import transaction
    	def reg():
    		with transaction.atomic():
             pass

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
	传文件对象 自动保存到提前配置好的路径下并存储该路径信息
    
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)  name(Charfield)
        info = MyCharField(max_length=64)    info(char)

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 = 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接收后端返回的数据
         	 $('#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>

标签:obj,models,max,查询,AJax,常用字,res,print
From: https://www.cnblogs.com/whxx/p/17372231.html

相关文章

  • 5、MySQL的SQL语言、数据库管理、数据类型及DQL的单、多表查询
    进入mysql后,使用help列出的是客户端的命令,使用helpcontents列出服务端命令SQL语句分类(DDLDMLDQL要记住)前三个重要(DDL、DML、DQL、DCL、TCL)DDL:DataDefinationLanguage数据定义语言CREATE,DROP,ALTER(对数据库、表、视图、索引进行创建、删除和更改的工具ALTER改格式)......
  • pgsql查询优化
    1、大表不做数据转换 假设a表是大表,b表是小表a.id=cast(b.idasvarchar)2、distinct导致没用上索引 删除distinct 3、exists 查询语句,关联大表,但查询字段有不需要用到这个大表 解决:把join去掉,改为exist,这样可以把记录数降下来selecta.id,a.namefroma......
  • 使用TPC-H 进行GreatSQL并行查询测试
    准备工作数据库版本GreatSQL-8.0.25-17生成数据使用TPC-H生成数据#TPC-HPopulationGenerator(Version3.0.0)#生成10G的数据$./dbgen-vf-s10修改my.cnfvim/etc/my.cnf#设置IPB为8Ginnodb_buffer_pool_size=8G#设置并行查询的使用最大内存(此处为8G,根......
  • conda虚拟机查询
    打开win+r输入cmd打开命令提示窗口输入代码查看conda版本conda-V输入代码查看虚拟环境列表candaenvlist输入代码打开虚拟环境condaactivate[env_name]这就是打开成功的样式......
  • 天气预报查询 API 提供个性化的天气服务的设计思路
    引言假设你是一个开发人员或公司,正在考虑开发一款天气应用程序,但你意识到市场上已经有很多竞争者在使用天气预报查询API来提供类似的服务,本文将一起探寻一些创新的方法来提高应用程序的竞争力。扩大竞争力的一些建议如果市面上已经有很多使用天气预报查询API的应用,您可以通......
  • 分页查询处理上百万数据 更新
    $count=Route::find()->where(['ro_visible'=>1])->count();//统计数据表数量$limit=100;$pagecount=ceil($count/$limit);//计算数据表的页数//事务执行$tr=Yii::$app->db->beginTransaction();try{for($page=1;$page<=$pagecount;$page++)......
  • Mybatis模糊查询:三种定义参数方法和聚合查询、主键回填
    Mybatis模糊查询:三种定义参数方法和聚合查询、主键回填      一、使用#定义参数1.持久层接口添加根据名字内容模糊查询方法2.UserMapper.xml映射文件添加标签3.添加测试方法4.运行结果二、使用$定义参数1.UserMapper.xml映射文件更改标签内容2.修改......
  • SQL Server(1)常用查询
    序言 结果集拼接左右横向拼接LEFTJOIN上线纵向拼接UNIONunion:得到两个查询结果的并集,并且自动去掉重复行。不会排序unionall:得到两个查询结果的并集,不会去掉重复行。也不会排序 YEARMONTH资料......
  • logn查询出现次数
    点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+7;intn,a[N];intb[N],c[N];vector<int>v[N];intmain(){ cin>>n; for(inti=1;i<=n;i++){ cin>>a[i]; b[i]=a[i]; c[i]=a[i]; } sort(b+1,b+1+n); intle......
  • 庆军之xamarin.forms 动态页面构造及查询补充
    为什么会有补充了,因为数据是能绑定了。但是又出现一个问题。如果换了条件,点击查询,会闪退。开始我还以为是占大量的内存的问题。在真实机,虚拟机上面都会。找了两天,突然想起来双向绑定可能存在问题。于是把ItemSource=DataTable.Rows改成了 ObservableCollection<DataRow>body......